Índice
Generalidades
El objetivo es desarrollar e implementar un modelo de predicción de rehospitalizaciones para apoyar los programas de evitabilidad post-hospitalaria. El análisis se realizará con información que describe las características sociodemográficas del individuo y con algunos datos recolectados por el personal hospitalario; para un periodo de tiempo de dos años y medio, que va desde 2016 hasta 2018.
Para el análisis realizado se consideró que una rehospitalización surge al cumplirse las siguientes condiciones: 1. Que 30 dias posteriores a una primera hospitalización, el paciente dabe recurrir nuevamente a una hospitalización. 2. Que los diagnósticos tanto de la primera como de la segunda hospitalizacipon coincidan en la categoria diagnóstico de la OMS.
Volver al Índice
Entendimiento de los datos
El archivo contiene registros que corresponden a eventos de rehospitalizaciones y se encuentra detallado a nivel de cada evento hospitalario. En total son 34898 registros, 18 variables, descartando de manera inicial, aquellos atributos que se derivan después del segundo diagnóstico; los datos se describen a continuación:
<<<<<<< HEAD
=======
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
-
Variables continuas (4)
-
dias_hosp: días de hospitalización
-
dias_uci: número días en UCI
-
dias_uce: número días en UCE
-
pago_hosp: valor pagado primera hospitalización
-
Variables nominales (5)
-
estrato: estrato Vivienda (0,1,2,3,4,5,6,-1)
-
est_civil: estado civil (C,D,S,U,V,-1)
-
ciudad: ciudad de contacto del asegurado
-
diagnos: código diagnóstico CIE10 de la primera atención
-
categoria: categoría del diagnóstico según el tipo de enfermedad
-
Variable dicotómica (4)
-
genero: género del asegurado (M,F)
-
ramo: ramo al que pertenece el asegurado
-
quirur: si tuvo algun tipo de servicio relacionado a procedimiento quirúrgico
-
rehosp_cat_oms: similitud categoría cie10. Esta es nuestra variable objetivo
-
Variables discretas (2)
-
edad: edad del asegurado en el momento de la hospitalización
-
marcas: cantidad de marcas confirmadas del asegurado
-
Variables ordinales (1)
-
ingreso: rango de ingresos
-
Fecha (1)
-
Fecha_Ingreso: fecha ingreso hospitalización
Generamos la estadística descriptiva; en ella se puede visualizar que será necesario realizar más adelante algunas conversiones en los tipos de datos que vienen por defecto (por ejemplo el estrato aparece como una variable numérica). Pero antes de continuar con la codificación, procederemos a observar como se encuentran nuestras variables.
Skim summary statistics
n obs: 34746
n variables: 18
-- Variable type:character -----------------------------------------------------
variable missing complete n min max empty n_unique
ciudad 0 34746 34746 4 25 0 320
diagnos 0 34746 34746 3 4 0 2974
est_civil 9055 25691 34746 1 1 0 5
genero 0 34746 34746 1 1 0 2
ingreso 14131 20615 34746 13 21 0 4
proveedor 3138 31608 34746 6 97 0 456
-- Variable type:numeric -------------------------------------------------------
variable missing complete n mean sd p0 p25 p50 p75 p100
categoria 0 34746 34746 123.93 56.36 2 95 122 162 262
dias_hosp 0 34746 34746 4.18 8.85 1 1 2 4 754
dias_uce 0 34746 34746 0.021 0.51 0 0 0 0 63
dias_uci 0 34746 34746 0.022 0.66 0 0 0 0 86
edad 0 34746 34746 50.2 18.07 18 36 48 63 102
estrato 10498 24248 34746 4.3 1.65 -1 3 5 6 6
marcas 0 34746 34746 0.63 0.93 0 0 0 1 6
pago_hosp 0 34746 34746 5705090.59 11443485.94 0 1181419.75 3020994 6175121.25 517393584
quirur 0 34746 34746 0.49 0.5 0 0 0 1 1
ramo 0 34746 34746 44.79 25.35 26 26 26 79 79
rehosp_oms 0 34746 34746 0.023 0.15 0 0 0 0 1
-- Variable type:POSIXct -------------------------------------------------------
variable missing complete n min max median n_unique
fecha_ingreso 0 34746 34746 2015-12-01 2018-09-03 2017-04-19 939
-
La variable ingreso es la que más datos perdidos tiene, seguida del estrato.
-
La mayoría de los pacientes no estuvieron ingresados en el UCI o en UCE
-
El pago hospitalario promedio fue de $5’706,108 con una desviación de $11’447,135 de la media, lo que indica una gran dispersión en los datos, y posible presencia de outliers.
A continuacion veremos algunas graficas que permiten realizar inferencias acerca del comportamiento de los datos:
<<<<<<< HEAD
require(scales)
Loading required package: scales
data_rehosp %>%
filter(pago_hosp > 0 & quirur == 0 & rehosp_oms == 1) %>%
group_by(fecha_ingreso) %>%
summarise_all(~sum(pago_hosp)) %>%
ggplot(
aes(
x=fecha_ingreso,
y=pago_hosp)) +
geom_line(
color = "#99CCFF",
size = 0.3) +
geom_smooth(method = "lm") +
theme_minimal() +
labs(title = "Pago Hosp en el tiempo",
x= "Fecha Ingreso",
y = "Pago Hosp") +
theme(plot.title = element_text(hjust = 0.5),
legend.position = "none") +
scale_y_continuous(labels = dollar) -> p11
p11 <- ggplotly(p11)
p11
=======
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
<<<<<<< HEAD
=======
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
<<<<<<< HEAD
data_rehosp %>%
group_by(ciudad) %>%
summarise_all(~sum(rehosp_oms)) %>%
filter(rehosp_oms > 8) %>%
ggplot(
aes(fill=ciudad,
x=ciudad,
y=rehosp_oms)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Rehospitalizacion por ciudad",
x= "Ciudad",
y = "Cant. Rehosp") +
theme(axis.text.x = element_text(angle = 90),
plot.title = element_text(hjust = 0.5),
legend.position = "none") +
scale_fill_brewer(palette = "Blues")-> p12
p12 <- ggplotly(p12)
p12
=======
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
<<<<<<< HEAD
=======
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
Volver al Índice
Análisis de Registros Pérdidos
En la gráfica siguiente podemos observar que hay en total 4 variables que contienen registros vacios: estrato, estado civil, ingreso y proveedor.
A nivel individual el porcentaje de valores perdidos para todos los casos es superior al 25%. De forma combinada hay más del 30% de campos vacíos; por ende no podemos decir que la probabilidad de que falte un valor depende solo del valor observado, y usar un método para imputarlo (la forma no es aleatoria).

Dado lo anterior, se hace necesario construir una tercera categoría, por lo menos para las variables que poseen menos campos vacíos (estrato y estado civil).
Para estimar si existe una asociación entre las variables que pueda derivarse en colinealidad, se procede primero a verificar que las variables no poseen una distribución normal, una vez realizado esto, se elige el test de Spearman para hallar la correlación lineal por atributo.
statistic p.value
pago_hosp 0.30905 0
dias_uci 0.5090968 0
dias_uce 0.5099771 0
dias_hosp 0.359832 0
rehosp_oms 0.5378271 0
Los resultados confirman que ninguna de las variables pesenta una distribución normal y las correlaciones relacionadas a continuación, verifican posibles asociaciones entre las variables de los días en que el paciente estuvo internado en la Unidad de Cuidados Intensivos, en la Unidad de Cuidados Especiales y los días que el paciente estuvo hospitalizado. Por conocimiento de facto, la relación entre la variable “dias_uci” y “dias_uce” es entendible, ya que cuando un paciente que ha pasado por la Unidad de Cuidados Intensivos pasó su momento de crisis y su estado de salud es más estable, suele ser remitido a la Unidad de Cuidados Especiales.

Sin embargo, las correlaciones obtenidas no cumplen un umbral suficiente para considerarlas importantes, por ende se procede a conservarlas y evaluar más adelante si es preciso eliminarlas definitivamente. Por otro lado, la variable categoría y diagnóstico están altamente correlacionadas con la variable endógena, por lo que es necesario eliminarlas del análisis, para no incurrir en posibles sobreajustes en la etapa de modelado.
Como se había mencionado anteriormente, teniendo en cuenta el análisis de datos perdidos o nulos, se decide descartar la variable ingreso ya que contiene mas de un 30% en datos perdidos.
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 34746 obs. of 12 variables:
$ edad : Factor w/ 7 levels "18-30","31-40",..: 3 4 7 1 5 3 2 7 2 7 ...
$ estrato : Factor w/ 7 levels "1","2","3","4",..: 7 4 5 3 7 6 7 7 4 4 ...
$ est_civil : Factor w/ 6 levels "C","D","S","Sin Informacion",..: 1 1 4 4 1 1 1 1 1 4 ...
$ genero : Factor w/ 2 levels "F","M": 1 2 1 1 2 1 2 2 1 1 ...
$ marcas : Factor w/ 3 levels "[0,2]","(2,4]",..: 1 1 1 1 1 1 1 1 1 1 ...
$ ramo : Factor w/ 2 levels "26","79": 1 1 1 2 1 1 1 1 1 2 ...
$ quirur : Factor w/ 2 levels "No","Si": 2 2 2 1 1 2 2 2 1 2 ...
$ dias_hosp : num 4 3 52 2 6 2 5 14 4 1 ...
$ dias_uci : num 0 0 0 0 0 0 0 0 0 0 ...
$ dias_uce : num 0 0 0 0 0 0 0 0 0 0 ...
$ pago_hosp : num 20604175 98000 2090823 1459979 246683 ...
$ rehosp_oms: num 0 0 0 0 0 0 0 0 0 0 ...
Volver al Índice
Análisis Exploratorio
Análisis univariado - variables continuas
Es evidente la existencia también, de valores atípicos muy marcados tanto en el numéro de días de hospitalización, como en los números de días que el paciente estuvo en la Unidad de Cuidado Intensivos y Especiales, en dónde los valores atípicos más grandes suceden en los eventos que no desencadenaron en rehospitalización.
<<<<<<< HEAD
=======
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
Con el análisis anterior no sólo se logra identificar la presencia de valores atípicos, sino que también es posible evidenciar que los datos se encuentran altamente desbalanceados. En el caso de los outliers se truncará en los casos en que sea necesario, imputando los valores que superen cierto límite en el percentil, tanto mayor como menor.
<<<<<<< HEAD
=======
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
Se puede observar que en la variable días UCI, correspondiente al primer diagnóstico, no parece haber una diferencia significativa en la distribución al discriminar por la variable objetivo binaria, es decir, entre los casos de rehospitalización (1) y casos de no rehospitalización (0). Adicionalmente, la distibución en ambas variables no es simétrica.
A pesar de que los datos se encuentran bastante dispersos, se logra identificar diferencias en la variable del pago -con valores más altos en los caso en que no terminó de buevo hospitalizado, y en el casó del número de días hospitalizado los rangos son mucho más pequeños cuando hay una rehospitalización.
Análisis variables categóricas
Observando las variables categóricas la diferencia entre la probabilidad de que el evento ocurra (haya rehospitalización) o no, se puede evidenciar sólo en algunas clases por categoría, pero en general, las proporciones suelen ser bastantes similares, por lo que no es posible elaborar a priori una hipótesis que estipule diferencias significativas en las distribuciones, por lo menos para ninguna de las dos variables relacionadas en el gráfico a continuación.

Por otro lado, el atributo que indica el hecho de que se hayan realizado procedimientos quirúrgicos durante la primera hospitalización muestran cierta diferencia en la distribuión por grupo; es más probable que la persona deba ser rehospitalizada de nuevo.

Con el objetivo de enriquecer el análisis exploratorio, se calcularán dos medidas muy comúnes de la teoría de la información, éstas permiten inferir algo del poder predictivo que pueden tener las variables independientes, antes de hacer parte de un modelo.
Volver al Índice
Análisis de clasificación binaria usando WOE y el IV
El peso de la evidencia (WOE) y el valor de la información (IV) ayudan, entre otras cosas, a determinar la contribución independiente de cada variable al resultado, y detectar relaciones lineales y no lineales. El WOE mide la relación entre la variable predictiva y el objeto binario, mientras que el IV mide la fuerza predictiva de esa relación.
La tabla a continuación contiene los valores del “valor de la información” con y sin el ajuste derivado de la validación cruzada. Cuando se realiza el ajuste con el objetivo de que los resultados sean más estables, tanto pago del diagnóstico, el hecho de que el paciente halla pasado por la Unidad de cuidados, y si fueron realizados procedimientos quirúrgicos serán las únicas variables con suficiente capacidad de predicción a nivel individual y univariable (Iv > 0.05). Cuando se relaja el supuesto, IV sin restar el penalty, se incluirían los días en que estuvo hospitalizado.
| |
Variable |
IV |
PENALTY |
AdjIV |
| 10 |
dias_uce |
3.2493169 |
0.5162541 |
2.7330628 |
| 9 |
dias_uci |
3.1969572 |
0.5881637 |
2.6087935 |
| 11 |
pago_hosp |
0.7340365 |
0.0828997 |
0.6511369 |
| 7 |
quirur |
0.3050877 |
0.0203025 |
0.2847852 |
| 8 |
dias_hosp |
0.0753638 |
0.0314285 |
0.0439353 |
| 4 |
genero |
0.0264964 |
0.0086772 |
0.0178192 |
| 5 |
marcas |
0.0051570 |
0.0014848 |
0.0036722 |
| 6 |
ramo |
0.0001644 |
0.0009926 |
-0.0008283 |
| 2 |
estrato |
0.0155690 |
0.0179440 |
-0.0023750 |
| 1 |
edad |
0.0248180 |
0.0273145 |
-0.0024965 |
| 3 |
est_civil |
0.0112672 |
0.0209304 |
-0.0096632 |
De acuerdo al poder predictivo de cada una de las variables, se eligen aquellas cuyo Valor de la informaciÓn (IV) sea superior al 2% (0,02). Las variables con IV inferiores a este valor se consideran impredictivas y se decide descartarlas. Las variables que continuan, en orden de relevancia segun su poder predictor, son:
-
pago_hosp
-
quirur
-
dias_uce
-
dias_uci
-
proveedor
-
dias_hosp
-
edad
-
genero
-
ciudad
Sin embargo, tanto la ciudad, como el proveedor no serán tenidos en cuenta, por que pueden llegar a condicionar nuestra variable objetivo. Adicionalmente, lo días UCE y UCI parecen estar altamente correlacionados con la variable objetivo, generando una sobrepredicción. Se evalúa ademas las condiciones que permiten generar estas dos ultimas variables encontrando que solo se almacenan cuando el valor pagado hasta el momento es cero; por todo esto estas dos variables tampoco serán tenidas en cuenta.
Enfocandonos en el pago del diagnóstico, el cual, es una de las variables con mayor influencia, el WOE nos indica una relación no lineal, con un incremento en el WOE a medida que disminuye el rango de pago en el diagnóstico.
| pago_hosp |
N |
Percent |
WOE |
IV |
PENALTY |
| [0,107820] |
2430 |
0.0999095 |
1.5471318 |
0.5258738 |
0.0273825 |
| [108200,759828] |
2433 |
0.1000329 |
-0.2229524 |
0.5303520 |
0.0335828 |
| [760095,1531408] |
2432 |
0.0999918 |
-0.0400625 |
0.5305094 |
0.0341146 |
| [1531618,2131592] |
2432 |
0.0999918 |
-0.4440218 |
0.5465638 |
0.0457588 |
| [2132115,2895004] |
2433 |
0.1000329 |
-0.5302479 |
0.5686062 |
0.0488086 |
| [2895083,3870803] |
2432 |
0.0999918 |
-0.5004264 |
0.5884919 |
0.0532475 |
| [3870853,4944123] |
2432 |
0.0999918 |
-0.9252740 |
0.6451388 |
0.0544036 |
| [4944436,6652726] |
2433 |
0.1000329 |
-0.5605176 |
0.6694431 |
0.0682488 |
| [6653181,10266934] |
2432 |
0.0999918 |
-0.4440218 |
0.6854975 |
0.0735695 |
| [10272268,35482810] |
2433 |
0.1000329 |
-0.8414772 |
0.7340365 |
0.0828997 |

Volver al Índice
Modelo
El objetivo principal del análisis es estimar un modelo predictivo con el cuál se pueda estimar la probabilidad de que un paciente termine en una rehospitalización, asociada a un diangóstico anterior. Para ello se empleará un modelo de regresión logística, el cuál es ampliamente utilizado para resolver problemas de clasificación binaria.
Una vez se realizan los filtros de calidad y completitud, y tras lo obtenido en los resultados del WOE, se procede a realizar la seleccion de variables para el modelo. Se tendrán en cuenta entonces, el pago realizado, los días en que estuvo el paciente de forma general, el hecho de que se le haya realizado o no una cirugía, el género, la edad y el estrato.
Para evaluar la capacidad de generalización del modelo, se dividirá el conjunto de datos en entrenamiento (70%) y prueba (30%).
También vamos a escalar nuestras variables numericas, debido a que tenemos unos valores muy altos en el pago de la hospitalización los cuales pueden generar influencias en el modelo hacia esta variable.
Volver al Índice
Smote
Como se habia mencionado anteriormente, la informacion se encuentra desbalanceada; esto es, teniendo en cuenta que el problema en que se esta trabajando consiste en la clasificacion de una variable dicotómica, se debe analizar el nivel de representacion de sus posibles valores dentro del conjunto total de datos.
| Var1 |
Freq |
| 0 |
0.9774075 |
| 1 |
0.0225925 |
Vemos que la representacion para la categoría positiva es un poco mas del 2% de la información. En este caso vamos a realizar un tratamiento que permita aumentar la clase minoritaria, sin utilizar soluciones genéricas como reducir la clase mayoritaria al nivel de la clase menor.
Para ello, vamos a utilizar la técnica SMOTE (Synthetic Minority Oversampling Method), la cual genera nuevas instancias artificiales de la clase más pequeña interpolando los valores de las instancias minoritarias más cercanas a una dada.
Por medio de SMOTE se generará un nuevo set de datos de entrenamiento, en el cual se tenga un 60% de informacion para la categoria negativa (rehosp_oms = 0) y 40% para la categoria positiva (rehosp_oms = 0).
str(training)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 24322 obs. of 7 variables:
$ pago_hosp : num -0.155 2.724 -0.41 -0.851 0.29 ...
$ quirur : Factor w/ 2 levels "No","Si": 1 2 2 1 2 2 1 2 2 1 ...
$ dias_hosp : num 0.0812 6.5769 -0.4185 -0.6683 -0.1686 ...
$ genero : Factor w/ 2 levels "F","M": 2 1 2 1 1 2 2 2 2 1 ...
$ edad : Factor w/ 7 levels "18-30","31-40",..: 3 4 5 1 5 2 1 1 1 2 ...
$ estrato : Factor w/ 7 levels "1","2","3","4",..: 4 7 7 6 5 4 6 2 2 6 ...
$ rehosp_oms: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
Verificamos que el set de entrenamiento se encuentre balanceado:
| Var1 |
Freq |
| 0 |
0.9764822 |
| 1 |
0.0235178 |
Volver al Índice
Ajuste del modelo y Estimación de parámetros
Del resultado exploratorio anterior, al discriminar el análisis de las variables independientes por nuestra variable objetivo (Rehospitalización), es posible evidenciar una diferencia clara entre las distribuciones para los atributos: Pago/costo del procedimiento y los días en que el usuario estuvo internado ya sea en la Unidad de Cuidados Intensivos o Especiales. Esto podría ser un indicio de que estas variables en particular, pueden llegar a ser relevantes para explicar la probabilidad de ocurrencia del evento, es decir, cuando hubo una hospitalización posterior ligada a un diagnóstico.
A continuación, al ajustar el modelo obtenemos los siguientes resultados:
Call:
glm(formula = rehosp_oms ~ pago_hosp + quirur + dias_hosp + edad +
genero + estrato, family = "binomial", data = training)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.6094 -1.1140 -0.5021 1.1033 3.1051
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.13570625347 0.53300976301 -4.007 0.0000615260562 ***
pago_hosp -0.00000012628 0.00000000877 -14.400 < 0.0000000000000002 ***
quirurSi -0.09375601316 0.06239552358 -1.503 0.1329
dias_hosp -0.03504819797 0.00898296724 -3.902 0.0000955478510 ***
edad31-40 -0.01164924207 0.10118934127 -0.115 0.9083
edad41-50 -0.11120786354 0.10920472425 -1.018 0.3085
edad51-60 0.07489395320 0.10778921483 0.695 0.4872
edad61-70 0.04905884646 0.11604741756 0.423 0.6725
edad71-80 0.26368015889 0.12977545360 2.032 0.0422 *
edad81+ 0.33860445642 0.13259960905 2.554 0.0107 *
generoM 0.40379731565 0.06076077834 6.646 0.0000000000302 ***
estrato2 2.58096504260 0.54360267715 4.748 0.0000020555103 ***
estrato3 2.49253642645 0.53317853445 4.675 0.0000029415039 ***
estrato4 2.39675199290 0.53234053081 4.502 0.0000067224843 ***
estrato5 2.59004679405 0.53065020906 4.881 0.0000010560663 ***
estrato6 2.25749343975 0.53016534402 4.258 0.0000206178006 ***
estratoSin Informacion 2.24793546586 0.52849607167 4.253 0.0000210495107 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 6723.3 on 4861 degrees of freedom
Residual deviance: 6280.2 on 4845 degrees of freedom
AIC: 6314.2
Number of Fisher Scoring iterations: 4
- Cada cambio en una unidad en el pago hospitalario disminuirá las probabilidades de rehospitalización, pero en una cantidad muy pequeña (-6.953E-08)
- Cuando a un paciente se le realizó un procedimiento quirúrgico su probabilidad de que termine hospitalizado de nuevo por el mismo diagnóstico, disminuye en más del 19% en comparación a cuando no se le realiza ninguna cirugía.
El resto de las variables no son suficientemente explicativas para predecir, de manera significativa, su efecto sobre la variable de respuesta binaria.
Después de estimados los coeficentes se procede a realizar la predicción dentro y fuera de muestra para evaluar la precisión (accuracy) y capacidad de generalización de nuestro modelo.
| Train |
Test |
| 0.6275195 |
0.6328665 |
Los resultados indican un nivel de accuracy de 62% en los datos de entrenamiento y 63% en testing. Para ver en detalle como se comporta, al discriminar entre los casos en que el paciente sale definitivamente o termina en una rehospitalización, y evidenciar su desempeño por separado, se estimará la matriz de confusión:
table(as.matrix(testing[, 7]), y_pred > 0.5)
FALSE TRUE
0 6464 3747
1 80 133
Resultados Curva de ROC:
<<<<<<< HEAD


=======


>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
###Regularizado
para la regularización se utilizará el paquete glmnet, el cual asigna un valor de alpha = 0 i es ridge y alpha = 1 si lasso. Antes de sumergirse en el código, vale la pena señalar lo siguiente:
glmnet no tiene una interfaz de fórmula, por lo que uno tiene que ingresar los predictores como una matriz y las etiquetas de clase como un vector.
no acepta predictores categóricos, por lo que uno tiene que convertirlos en valores numéricos antes de pasarlos a glmnet.
La función glmnet model.matrix crea la matriz y también convierte los predictores categóricos en variables ficticias apropiadas; mientras que se usará la función cv.glmnet , para encontra de manera automáticauna el valor óptimo de lambda.
library(glmnet)
Loading required package: foreach
Loaded glmnet 2.0-16
library(Matrix)
set.seed(123)
x_train <- model.matrix(rehosp_oms~., training)[,-1]
y_train <- ifelse(training$rehosp_oms == "1", 1, 0)
##Hallando el mejor lambda
cv.lasso <- cv.glmnet(x_train, y_train, family = "binomial", type.measure = "mse", alpha = 1)
plot(cv.lasso)
<<<<<<< HEAD

=======

>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
La gráfica muestra que el registro del valor óptimo de lambda (es decir, el que minimiza el error cuadrático medio) es aproximadamente -3. El valor exacto se puede ver al examinar la variable lambda_min en el código a continuación. En general, sin embargo, el objetivo de la regularización es equilibrar la precisión y la simplicidad. En el contexto actual, esto significa un modelo con el menor número de coeficientes que también proporciona una buena precisión .
cv.lasso$lambda.min
[1] 0.000131134
En general, el propósito de la regularización es equilibrar la precisión y la simplicidad. Esto significa, un modelo con el menor número de predictores que también da una buena precisión. Para este fin, la función cv.glmnet() también encuentra el valor de lambda que proporciona el modelo más simple pero también se encuentra dentro de un error estándar del valor óptimo de lambda. Este valor se llama lambda.1se. Este valor de lambda ( lambda.1se) es lo que usaremos en el resto de la computación.
cv.lasso$lambda.1se
[1] 0.005946767
coef(cv.lasso, cv.lasso$lambda.min)
<<<<<<< HEAD
17 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -2.41497113
pago_hosp -0.64649641
quirurSi -0.09300654
dias_hosp -0.13762220
generoM 0.40042942
edad31-40 -0.01072377
edad41-50 -0.11164113
edad51-60 0.08597407
edad61-70 0.04578545
edad71-80 0.26002865
edad81+ 0.30510387
estrato2 2.16974765
estrato3 2.08361790
estrato4 1.97948027
estrato5 2.18693408
estrato6 1.85257075
estratoSin Informacion 1.83963539
=======
17 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -1.7296262081942
pago_hosp -0.0000001259502
quirurSi -0.0928946435941
dias_hosp -0.0348692655857
generoM 0.4022887104768
edad31-40 -0.0121447540136
edad41-50 -0.1113340132745
edad51-60 0.0726314737882
edad61-70 0.0460806011316
edad71-80 0.2594710942675
edad81+ 0.3347007372389
estrato2 2.1715243332904
estrato3 2.0842375239613
estrato4 1.9888164615189
estrato5 2.1826023215452
estrato6 1.8506422113707
estratoSin Informacion 1.8412870946351
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
La salida muestra que solo aquellas variables que hemos determinado que son significativas en base a los valores de p tienen coeficientes distintos de cero, en este caso el pago hospitalario, todos los coeficientes de las demás variables han sido puestos a cero por el algoritmo.
Usando lambda.1secomo la mejor lambda, da los siguientes coeficientes de regresión:
coef(cv.lasso, cv.lasso$lambda.1se)
<<<<<<< HEAD
17 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -0.46866553
pago_hosp -0.59606100
quirurSi -0.05311049
dias_hosp -0.10030732
generoM 0.34626620
edad31-40 .
edad41-50 -0.08965206
edad51-60 .
edad61-70 .
edad71-80 0.12773589
edad81+ 0.18538681
estrato2 0.16197672
estrato3 0.12046719
estrato4 0.02468292
estrato5 0.24615151
estrato6 .
estratoSin Informacion -0.01089099
=======
17 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) 0.1334754646798
pago_hosp -0.0000001161305
quirurSi -0.0530552260633
dias_hosp -0.0254948526646
generoM 0.3475999609257
edad31-40 .
edad41-50 -0.0854613516840
edad51-60 .
edad61-70 .
edad71-80 0.1315038896336
edad81+ 0.2192614041193
estrato2 0.1657261986570
estrato3 0.1230504934360
estrato4 0.0358574669297
estrato5 0.2429403712608
estrato6 .
estratoSin Informacion -0.0077841915504
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
Usando lambda.1se, los coeficiente de 4 variables se han establecido en cero mediante el algoritmo de lazo, reduciendo la complejidad del modelo.
La configuración de lambda = lambda.1se produce un modelo más simple en comparación con lambda.min, pero el modelo podría ser un poco menos preciso que el obtenido con lambda.min.
##Lambda regression
std_ridge_logit <- glmnet(x_train, y_train, family="binomial", alpha=1)
SRL_pred_train <- predict(std_ridge_logit, x_train, type="class", s=cv.lasso$lambda.1se)
###Matriz training
confusion_matrix_train <- table(y_train, SRL_pred_train)
confusion_matrix_train
<<<<<<< HEAD
SRL_pred_train
y_train 0 1
0 1669 905
1 870 1418
=======
SRL_pred_train
y_train 0 1
0 1674 900
1 885 1403
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
error_rate_train <- (760+920)/(760+920+1814+1368)
error_rate_train
[1] 0.3455368
###Matriz test
x_test <- model.matrix(rehosp_oms~., testing)[,-1]
y_test <- ifelse(testing$rehosp_oms == 1, 1, 0)
SRL_pred_test <- predict(std_ridge_logit, x_test, type="class", s=cv.lasso$lambda.1se)
confusion_matrix_test <- table(y_test, SRL_pred_test)
confusion_matrix_test
<<<<<<< HEAD
SRL_pred_test
y_test 0 1
0 10203 8
1 212 1
=======
SRL_pred_test
y_test 0 1
0 6592 3619
1 79 134
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
error_rate_test <- (84+2867)/(7344+2867+84+129)
error_rate_test
[1] 0.2830967
Calculando el modelo con ridge:
##Hallando el mejor lambda
cv.ridge <- cv.glmnet(x_train, y_train, family = "binomial", type.measure = "mse", alpha = 0)
coef(cv.ridge, cv.ridge$lambda.1se)
<<<<<<< HEAD
17 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -0.368063159
pago_hosp -0.427054329
quirurSi -0.124573222
dias_hosp -0.102444657
generoM 0.310066681
edad31-40 -0.031937967
edad41-50 -0.115071875
edad51-60 0.046115684
edad61-70 -0.005007767
edad71-80 0.160966635
edad81+ 0.224934856
estrato2 0.214237705
estrato3 0.143210985
estrato4 0.063776062
estrato5 0.232064630
estrato6 -0.021297719
estratoSin Informacion -0.043437538
=======
17 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) 0.09597349898288
pago_hosp -0.00000008322216
quirurSi -0.12440190513939
dias_hosp -0.02592083546487
generoM 0.31119636742413
edad31-40 -0.03339217787436
edad41-50 -0.11507882715603
edad51-60 0.03464829134092
edad61-70 -0.00493534623795
edad71-80 0.16050422933623
edad81+ 0.24919816765973
estrato2 0.21490134539391
estrato3 0.14314242778220
estrato4 0.07090493090328
estrato5 0.22761910704584
estrato6 -0.02329585567823
estratoSin Informacion -0.04251663877767
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7
SRR_pred_test <- predict(std_ridge_logit, x_test, type="class", s=cv.ridge$lambda.1se)
confusion_matrix_test <- table(y_test, SRR_pred_test)
confusion_matrix_test
SRR_pred_test
y_test 0
0 10211
1 213
Volver al Índice
Recomendaciones y Estrategias
Como se pudo observar en la definicion de la variable endógena de la rehospitalización, esta se construyó mediante dos restricciones en el set de datos inicial: 1. Que dentro de los siguientes 30 dias a la primera hospitalización surgiera una segunda hospitalizacion. 2. Que para aquellos casos donde hay dos eventos en la ventana de 30 días, los códigos de diagnóstico CIE10 del primero y segundo evento pertenecieran a la misma categoría de diagóstico en la clasificación de la OMS.
En este sentido, tenemos dos condicionantes que se podrían ajustar, ya que restringen la posibilidad de encontrar un mayor numero de casos que se puedan considerar como rehospitalización; por ejemplo, algunos estudios sugieren que la ventana de tiempo podría ser de 15 dias entre el primer y segundo evento. En cuanto a la similitud de los diagnósticos de ambos eventos, para este modelo se tuvo en cuenta solo si ambos diagnósticos pertenecen a la misma categoría, sin embargo es importante tener en cuenta que hay diagnósticos que pueden desencadenar en otros que no necesariamente sean de la misma categoría. Este tipo de asociaciones requieren de un mayor análisis a nivel médico.
Se han descrito factores asociados con la rehospitalizacion relacionados con la calidad de vida de los pacientes, sin embargo en este modelo no se incluyo gran parte de este tipo de informacion, ya que, desde el principio, la población objetivo se compone de individuos asegurados en poliza de vida y salud, en su mayoria, de estrato cuatro hacia arriba. De esta forma ya no aporta información medir el nivel de calidad de vida o falicidad de acceso a los servicios de salud, pero se podria tener en cuenta información relacionada con sintomas depresivos.
La calidad en el cuidado hospitalario tambien se ha considerado como un factor importante, por lo tanto se podría considerar la agregación de información que indique que tan óptimas son las condiciones para una buena atención en los centros hospitalarios y lugares que se tuvieron en cuenta.
<<<<<<< HEAD
LS0tDQp0aXRsZTogIjxzcGFuIHN0eWxlPSdjb2xvcjojMzA1ZjcyJz48Y2VudGVyPjxicj5Nb2RlbG8gZGUgUHJlZGljY2nDs24gUmVob3NwaXRhbGl6YWNpw7NuPC9jZW50ZXI+Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpkYXRlOiAiPGNlbnRlcj5BYnJpbCAyMDE5PC9jZW50ZXI+Ig0KYXV0aG9yOiAiPGNlbnRlcj48YSBocmVmPSdtYWlsdG86YW5kcmVzLmdvbnphbGV6QGRhdGFseXRpY3MuY29tJz5BbmRyw6lzIEZlbGlwZSBHb256w6FsZXo8L2E+PC9jZW50ZXI+Ig0KLS0tDQoNCjxocj4NCjx0YWJsZT4NCjx0cj4NCjx0ZD48aW1nIHN0eWxlPSJ3aWR0aDoyODBweDsgaGVpZ2h0OjIwMHB4OyIgc3JjPSJTVVJBLnBuZyIgLz48L3RkPg0KPHRkPjxpbWcgc3R5bGU9IndpZHRoOjIwMHB4OyBoZWlnaHQ6MTUwcHg7IiBzcmM9ImJsYW5jby5qcGciIC8+PC90ZD4NCjx0ZD48aW1nIHN0eWxlPSJ3aWR0aDozNjBweDsgaGVpZ2h0OjEwMHB4OyIgc3JjPSJEYXRhbHl0aWNzLnBuZyIgLz48L3RkPg0KPC90cj4NCjwvdGFibGU+DQo8aHI+DQoNCjxoMyBpZD0iaW5kaWNlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPsONbmRpY2U8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIHByZXNlbnRlIG5vdGVib29rIGNvbnRpZW5lIGluZm9ybWFjacOzbiByZWxhY2lvbmFkYSBhbCBlbnRlbmRpbWllbnRvIGRlIGxvcyBkYXRvcyB5IHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGRlIHVuIG1vZGVsbyBkZSBwcmVkaWNjacOzbiBwYXJhIGVsIHByb2JsZW1hIGRlIHJlaG9zcGl0YWxpemFjacOzbi4NCg0KPG9sPg0KICAgIDxsaT48YSBocmVmPSIjR2VuZXJhbGlkYWRlcyI+R2VuZXJhbGlkYWRlczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjRW50ZW5kaW1pZW50byI+RW50ZW5kaW1pZW50byBkZSBsb3MgZGF0b3M8L2E+PC9saT4NCiAgICA8bGk+PGEgaHJlZj0iI1BlcmRpZG9zIj5BbsOhbGlzaXMgZGUgUmVnaXN0cm9zIFDDqXJkaWRvczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjQW5hbGlzaXMiPkFuw6FsaXNpcyBFeHBsb3JhdG9yaW88L2E+PC9saT4NCiAgICAgIDxvbD4NCiAgICAgICAgPGxpPjxhIGhyZWY9IiNBbmFsaXNpc0NvbiI+QW7DoWxpc2lzIHVuaXZhcmlhZG8gLSB2YXJpYWJsZXMgY29udGludWFzPC9hPjwvbGk+DQogICAgICAgIDxsaT48YSBocmVmPSIjQW5hbGlzaXNDYXIiPkFuw6FsaXNpcyB1bml2YXJpYWRvIC0gdmFyaWFibGVzIGNhcmRpbmFsZXM8L2E+PC9saT4NCiAgICAgIDwvb2w+DQogICAgPGxpPjxhIGhyZWY9IiNBbmFsaXNpc1dPRSI+QW7DoWxpc2lzIGRlIGNsYXNpZmljYWNpw7NuIGJpbmFyaWEgdXNhbmRvIFdPRSB5IGVsIElWPC9hPjwvbGk+DQogICAgPGxpPjxhIGhyZWY9IiNNb2RlbG8iPk1vZGVsbzwvYT48L2xpPg0KICAgICAgPG9sPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI1NNT1RFIj5TTU9URSAtIEJhbGFuY2VvIGRlIGNhdGVnb3JpYSBtaW5vcml0YXJpYTwvYT48L2xpPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI0FqdXN0ZW1vZCI+QWp1c3RlIGRlbCBtb2RlbG8geSBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvczwvYT48L2xpPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI0V2YWx1YWNpb24iPlByZWRpY2llbmRvIHkgZXZhbHVhbmRvIGVsIGRlc2VtcGXDsW8gZGVsIG1vZGVsbzwvYT48L2xpPg0KICAgICAgPC9vbD4NCiAgICA8bGk+PGEgaHJlZj0iI0NvbmNsdXNpb25lcyI+UmVzdWx0YWRvcyB5IENvbmNsdXNpb25lczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjUmVjb21lbmRhY2lvbiI+UmVjb21lbmRhY2lvbmVzIHkgRXN0cmF0ZWdpYXM8L2E+PC9saT4NCjwvb2w+DQoNCkhhY2llbmRvIGNsaWNrIHNvYnJlIGNhZGEgdW5hIGRlIGxhcyBzZWNjaW9uZXMgcHVlZGUgaXIgZGlyZWN0YW1lbnRlIGEgY2FkYSB1bmEgZGUgZWxsYXMuIEFsIGZpbmFsaXphciBjYWRhIHNlY2Npw7NuIGVuY29udHJhcsOhIHVuIGxpbmsgcGFyYSB2b2x2ZXIgYWwgw61uZGljZS48L2Rpdj4NCjxocj4NCg0KPGgzIGlkPSJHZW5lcmFsaWRhZGVzIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPkdlbmVyYWxpZGFkZXM8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIG9iamV0aXZvIGVzIGRlc2Fycm9sbGFyIGUgaW1wbGVtZW50YXIgdW4gbW9kZWxvIGRlIHByZWRpY2Npw7NuIGRlIHJlaG9zcGl0YWxpemFjaW9uZXMgcGFyYSBhcG95YXIgbG9zIHByb2dyYW1hcyBkZSBldml0YWJpbGlkYWQgcG9zdC1ob3NwaXRhbGFyaWEuIEVsIGFuw6FsaXNpcyBzZSByZWFsaXphcsOhIGNvbiBpbmZvcm1hY2nDs24gcXVlIGRlc2NyaWJlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIHNvY2lvZGVtb2dyw6FmaWNhcyBkZWwgaW5kaXZpZHVvIHkgY29uIGFsZ3Vub3MgZGF0b3MgcmVjb2xlY3RhZG9zIHBvciBlbCBwZXJzb25hbCBob3NwaXRhbGFyaW87IHBhcmEgdW4gcGVyaW9kbyBkZSB0aWVtcG8gZGUgZG9zIGHDsW9zIHkgbWVkaW8sIHF1ZSB2YSBkZXNkZSAyMDE2IGhhc3RhIDIwMTguDQoNClBhcmEgZWwgYW7DoWxpc2lzIHJlYWxpemFkbyBzZSBjb25zaWRlcsOzIHF1ZSB1bmEgcmVob3NwaXRhbGl6YWNpw7NuIHN1cmdlIGFsIGN1bXBsaXJzZSBsYXMgc2lndWllbnRlcyBjb25kaWNpb25lczoNCjEuIFF1ZSAzMCBkaWFzIHBvc3RlcmlvcmVzIGEgdW5hIHByaW1lcmEgaG9zcGl0YWxpemFjacOzbiwgZWwgcGFjaWVudGUgZGFiZSByZWN1cnJpciBudWV2YW1lbnRlIGEgdW5hIGhvc3BpdGFsaXphY2nDs24uDQoyLiBRdWUgbG9zIGRpYWduw7NzdGljb3MgdGFudG8gZGUgbGEgcHJpbWVyYSBjb21vIGRlIGxhIHNlZ3VuZGEgaG9zcGl0YWxpemFjaXBvbiBjb2luY2lkYW4gZW4gbGEgY2F0ZWdvcmlhIGRpYWduw7NzdGljbyBkZSBsYSBPTVMuDQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpybShsaXN0ID0gbHMoKSkNCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQpzb3VyY2UoImZ1bmN0aW9uc19wbG90LlIiKQ0KDQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoInJlYWR4bCIsICJkcGx5ciIsICJnZ3Bsb3QyIiwgImdnY29ycnBsb3QiLCAiVklNIiwgIlJDb2xvckJyZXdlciIsICJJbmZvcm1hdGlvbiIsICJrbml0ciIsICJrYWJsZUV4dHJhIiwgImdyaWRFeHRyYSIsICJza2ltciIsICJub3J0ZXN0IiwgIkdHYWxseSIsICJwbG90bHkiLCAibGF0dGljZSIsICJETXdSIiwgImNhVG9vbHMiLCAicGxvdGx5IikNCg0KbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbIShsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQ0KDQpsb2FkIDwtIGxhcHBseShsaXN0Lm9mLnBhY2thZ2VzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQpgYGANCg0KPGhyPg0KPGgzIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBpZD0iRW50ZW5kaW1pZW50byIgbWFya2Rvd24gPSAiMSI+RW50ZW5kaW1pZW50byBkZSBsb3MgZGF0b3M8L2gzPg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+IA0KDQpFbCBhcmNoaXZvIGNvbnRpZW5lIHJlZ2lzdHJvcyBxdWUgY29ycmVzcG9uZGVuIGEgZXZlbnRvcyBkZSByZWhvc3BpdGFsaXphY2lvbmVzIHkgc2UgZW5jdWVudHJhIGRldGFsbGFkbyBhIG5pdmVsIGRlIGNhZGEgZXZlbnRvIGhvc3BpdGFsYXJpby4gRW4gdG90YWwgc29uIDM0ODk4IHJlZ2lzdHJvcywgMTggdmFyaWFibGVzLCBkZXNjYXJ0YW5kbyBkZSBtYW5lcmEgaW5pY2lhbCwgYXF1ZWxsb3MgYXRyaWJ1dG9zIHF1ZSBzZSBkZXJpdmFuIGRlc3B1w6lzIGRlbCBzZWd1bmRvIGRpYWduw7NzdGljbzsgbG9zIGRhdG9zIHNlIGRlc2NyaWJlbiBhIGNvbnRpbnVhY2nDs246PC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KZGF0YV9yZWhvc3AgPC0gcmVhZF94bHN4KCJEQVRBX1JFSE9TUC54bHN4IixuYSA9IGMoIm5hIiwgIk5BIiwgIm51bGwiLCAiTlVMTCIpKQ0KZGF0YV9yZWhvc3AgJT4lDQogIHNlbGVjdChFZGFkX0hvc3BpdGFsaXphY2lvbiwNCiAgICAgICAgIEVzdHJhdG9fVml2aWVuZGEsDQogICAgICAgICBSYW5nb19JbmdyZXNvc19EZXNjLA0KICAgICAgICAgRXN0YWRvX0NpdmlsLA0KICAgICAgICAgR2VuZXJvLA0KICAgICAgICAgY2FudGlkYWRfbWFyY2FzLA0KICAgICAgICAgUmFtb19JZCwNCiAgICAgICAgIENpdWRhZF9Db250YWN0b19Ob21icmUsDQogICAgICAgICBDb2RpZ29fRGlhZ25vc3RpY29fT3AsDQogICAgICAgICBDYXRlZ29yaWFfRHhfSWQsDQogICAgICAgICBRdWlydXJnaWNvLA0KICAgICAgICAgRmVjaGFfSW5ncmVzb19Ib3NwLA0KICAgICAgICAgTnVtZXJvX0RpYXNfSG9zcGl0YWxhcmlvLA0KICAgICAgICAgTnVtZXJvX0RpYXNfVWNpLA0KICAgICAgICAgTnVtZXJvX0RpYXNfVWNlLA0KICAgICAgICAgUHJvdmVlZG9yLA0KICAgICAgICAgVmFsb3JfUGFnYWRvX0RpYWdub3N0aWNvLA0KICAgICAgICAgcmVob3NwX2NhdF9vbXMpICU+JQ0KICByZW5hbWUoZWRhZCA9IEVkYWRfSG9zcGl0YWxpemFjaW9uLCANCiAgICAgICAgIGVzdHJhdG8gPSBFc3RyYXRvX1ZpdmllbmRhLA0KICAgICAgICAgaW5ncmVzbyA9IFJhbmdvX0luZ3Jlc29zX0Rlc2MsDQogICAgICAgICBlc3RfY2l2aWwgPSBFc3RhZG9fQ2l2aWwsDQogICAgICAgICBnZW5lcm8gPSBHZW5lcm8sDQogICAgICAgICBtYXJjYXMgPSBjYW50aWRhZF9tYXJjYXMsDQogICAgICAgICByYW1vID0gUmFtb19JZCwNCiAgICAgICAgIGNpdWRhZCA9IENpdWRhZF9Db250YWN0b19Ob21icmUsDQogICAgICAgICBkaWFnbm9zID0gQ29kaWdvX0RpYWdub3N0aWNvX09wLA0KICAgICAgICAgY2F0ZWdvcmlhID0gQ2F0ZWdvcmlhX0R4X0lkLA0KICAgICAgICAgcXVpcnVyID0gUXVpcnVyZ2ljbywNCiAgICAgICAgIGZlY2hhX2luZ3Jlc28gPSBGZWNoYV9JbmdyZXNvX0hvc3AsDQogICAgICAgICBkaWFzX2hvc3AgPSBOdW1lcm9fRGlhc19Ib3NwaXRhbGFyaW8sDQogICAgICAgICBkaWFzX3VjaSA9IE51bWVyb19EaWFzX1VjaSwNCiAgICAgICAgIGRpYXNfdWNlID0gTnVtZXJvX0RpYXNfVWNlLA0KICAgICAgICAgcHJvdmVlZG9yID0gUHJvdmVlZG9yLA0KICAgICAgICAgcGFnb19ob3NwID0gVmFsb3JfUGFnYWRvX0RpYWdub3N0aWNvLA0KICAgICAgICAgcmVob3NwX29tcyA9IHJlaG9zcF9jYXRfb21zKSAtPiBkYXRhX3JlaG9zcA0KaGVhZChkYXRhX3JlaG9zcCkNCmBgYA0KDQo8dWw+DQo8bGk+VmFyaWFibGVzIGNvbnRpbnVhcyAoNCkNCjx1bD4NCjxsaT5kaWFzX2hvc3A6IGTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs248L2xpPg0KPGxpPmRpYXNfdWNpOiBuw7ptZXJvIGTDrWFzIGVuIFVDSTwvbGk+DQo8bGk+ZGlhc191Y2U6IG7Dum1lcm8gZMOtYXMgZW4gVUNFPC9saT4NCjxsaT5wYWdvX2hvc3A6IHZhbG9yIHBhZ2FkbyBwcmltZXJhIGhvc3BpdGFsaXphY2nDs248L2xpPg0KPC91bD4NCjwvbGk+DQo8L3VsPg0KPHVsPg0KPGxpPlZhcmlhYmxlcyBub21pbmFsZXMgKDUpDQo8dWw+DQo8bGk+ZXN0cmF0bzogZXN0cmF0byBWaXZpZW5kYSAoMCwxLDIsMyw0LDUsNiwtMSk8L2xpPg0KPGxpPmVzdF9jaXZpbDogZXN0YWRvIGNpdmlsIChDLEQsUyxVLFYsLTEpPC9saT4NCjxsaT5jaXVkYWQ6IGNpdWRhZCBkZSBjb250YWN0byBkZWwgYXNlZ3VyYWRvPC9saT4NCjxsaT5kaWFnbm9zOiBjw7NkaWdvIGRpYWduw7NzdGljbyBDSUUxMCBkZSBsYSBwcmltZXJhIGF0ZW5jacOzbiA8L2xpPg0KPGxpPmNhdGVnb3JpYTogY2F0ZWdvcsOtYSBkZWwgZGlhZ27Ds3N0aWNvIHNlZ8O6biBlbCB0aXBvIGRlIGVuZmVybWVkYWQ8L2xpPg0KPC91bD4NCjwvbGk+DQo8L3VsPg0KPHVsPg0KPGxpPlZhcmlhYmxlIGRpY290w7NtaWNhICg0KQ0KPHVsPg0KPGxpPmdlbmVybzogZ8OpbmVybyBkZWwgYXNlZ3VyYWRvIChNLEYpPC9saT4NCjxsaT5yYW1vOiByYW1vIGFsIHF1ZSBwZXJ0ZW5lY2UgZWwgYXNlZ3VyYWRvPC9saT4NCjxsaT5xdWlydXI6IHNpIHR1dm8gYWxndW4gdGlwbyBkZSBzZXJ2aWNpbyByZWxhY2lvbmFkbyBhIHByb2NlZGltaWVudG8gcXVpcsO6cmdpY288L2xpPg0KPGxpPnJlaG9zcF9jYXRfb21zOiBzaW1pbGl0dWQgY2F0ZWdvcsOtYSBjaWUxMC4gRXN0YSBlcyBudWVzdHJhIHZhcmlhYmxlIG9iamV0aXZvIDwvbGk+DQo8L3VsPg0KPC9saT4NCjwvdWw+DQo8dWw+DQo8bGk+VmFyaWFibGVzIGRpc2NyZXRhcyAoMikNCjx1bD4NCjxsaT5lZGFkOiBlZGFkIGRlbCBhc2VndXJhZG8gZW4gZWwgbW9tZW50byBkZSBsYSBob3NwaXRhbGl6YWNpw7NuPC9saT4NCjxsaT5tYXJjYXM6IGNhbnRpZGFkIGRlIG1hcmNhcyBjb25maXJtYWRhcyBkZWwgYXNlZ3VyYWRvPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCjx1bD4NCjxsaT5WYXJpYWJsZXMgb3JkaW5hbGVzICgxKQ0KPHVsPg0KPGxpPmluZ3Jlc286IHJhbmdvIGRlIGluZ3Jlc29zPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCjx1bD4NCjxsaT5GZWNoYSAoMSkNCjx1bD4NCjxsaT5GZWNoYV9JbmdyZXNvOiBmZWNoYSBpbmdyZXNvIGhvc3BpdGFsaXphY2nDs24gPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+DQpHZW5lcmFtb3MgbGEgZXN0YWTDrXN0aWNhIGRlc2NyaXB0aXZhOyBlbiBlbGxhIHNlIHB1ZWRlIHZpc3VhbGl6YXIgcXVlIHNlcsOhIG5lY2VzYXJpbyByZWFsaXphciBtw6FzIGFkZWxhbnRlIGFsZ3VuYXMgY29udmVyc2lvbmVzIGVuIGxvcyB0aXBvcyBkZSBkYXRvcyBxdWUgdmllbmVuIHBvciBkZWZlY3RvIChwb3IgZWplbXBsbyBlbCBlc3RyYXRvIGFwYXJlY2UgY29tbyB1bmEgdmFyaWFibGUgbnVtw6lyaWNhKS4gUGVybyBhbnRlcyBkZSBjb250aW51YXIgY29uIGxhIGNvZGlmaWNhY2nDs24sIHByb2NlZGVyZW1vcyBhIG9ic2VydmFyIGNvbW8gc2UgZW5jdWVudHJhbiBudWVzdHJhcyB2YXJpYWJsZXMuPC9kaXY+DQoNCjxicj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpza2ltX3dpdGgobnVtZXJpYyA9IGxpc3QoaGlzdCA9IE5VTEwpKQ0KDQpkYXRhX3JlaG9zcCAlPiUgDQogIGdyb3VwX2J5KCkgJT4lDQogIHNraW0oKQ0KYGBgDQoNCjx1bD4NCjxsaT5MYSB2YXJpYWJsZSBpbmdyZXNvIGVzIGxhIHF1ZSBtw6FzIGRhdG9zIHBlcmRpZG9zIHRpZW5lLCBzZWd1aWRhIGRlbCBlc3RyYXRvLg0KPGxpPkxhIG1heW9yw61hIGRlIGxvcyBwYWNpZW50ZXMgbm8gZXN0dXZpZXJvbiBpbmdyZXNhZG9zIGVuIGVsIFVDSSBvIGVuIFVDRQ0KPGxpPkVsIHBhZ28gaG9zcGl0YWxhcmlvIHByb21lZGlvIGZ1ZSBkZSAkNSc3MDYsMTA4IGNvbiB1bmEgZGVzdmlhY2nDs24gZGUgJDExJzQ0NywxMzUgZGUgbGEgbWVkaWEsIGxvIHF1ZSBpbmRpY2EgdW5hIGdyYW4gZGlzcGVyc2nDs24gZW4gbG9zIGRhdG9zLCB5IHBvc2libGUgcHJlc2VuY2lhIGRlIG91dGxpZXJzLg0KPHVsPg0KDQo8YnI+DQoNCkEgY29udGludWFjaW9uIHZlcmVtb3MgYWxndW5hcyBncmFmaWNhcyBxdWUgcGVybWl0ZW4gcmVhbGl6YXIgaW5mZXJlbmNpYXMgYWNlcmNhIGRlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgZGF0b3M6DQpgYGB7cn0NCnJlcXVpcmUoc2NhbGVzKQ0KDQpkYXRhX3JlaG9zcCAlPiUNCiAgZmlsdGVyKHBhZ29faG9zcCA+IDAgJiBxdWlydXIgPT0gMCAmIHJlaG9zcF9vbXMgPT0gMSkgJT4lDQogIGdyb3VwX2J5KGZlY2hhX2luZ3Jlc28pICU+JQ0KICBzdW1tYXJpc2VfYWxsKH5zdW0ocGFnb19ob3NwKSkgJT4lDQogICAgZ2dwbG90KA0KICAgICAgYWVzKA0KICAgICAgICB4PWZlY2hhX2luZ3Jlc28sIA0KICAgICAgICB5PXBhZ29faG9zcCkpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBjb2xvciA9ICIjOTlDQ0ZGIiwgDQogICAgICBzaXplID0gMC4zKSArIA0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKHRpdGxlID0gIlBhZ28gSG9zcCBlbiBlbCB0aWVtcG8iLA0KICAgICAgICAgeD0gIkZlY2hhIEluZ3Jlc28iLA0KICAgICAgICAgeSA9ICJQYWdvIEhvc3AiKSArDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIA0KICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBkb2xsYXIpIC0+IHAxMQ0KDQpwMTEgPC0gZ2dwbG90bHkocDExKQ0KcDExDQpgYGANCg0KYGBge3J9DQpkYXRhX3JlaG9zcCAlPiUNCiAgZ3JvdXBfYnkoY2l1ZGFkKSAlPiUNCiAgc3VtbWFyaXNlX2FsbCh+c3VtKHJlaG9zcF9vbXMpKSAlPiUNCiAgZmlsdGVyKHJlaG9zcF9vbXMgPiA4KSAlPiUNCiAgICBnZ3Bsb3QoDQogICAgICBhZXMoZmlsbD1jaXVkYWQsDQogICAgICAgICAgeD1jaXVkYWQsIA0KICAgICAgICAgIHk9cmVob3NwX29tcykpICsNCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIGxhYnModGl0bGUgPSAiUmVob3NwaXRhbGl6YWNpb24gcG9yIGNpdWRhZCIsDQogICAgICAgICB4PSAiQ2l1ZGFkIiwNCiAgICAgICAgIHkgPSAiQ2FudC4gUmVob3NwIikgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQmx1ZXMiKS0+IHAxMg0KDQpwMTIgPC0gZ2dwbG90bHkocDEyKQ0KcDEyDQoNCmBgYA0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUUsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9DQogcmVxdWlyZShzY2FsZXMpDQogDQpkYXRhX3JlaG9zcCAlPiUNCiAgZmlsdGVyKHJlaG9zcF9vbXMgPiAwKSAlPiUNCiAgZ3JvdXBfYnkoZmVjaGFfaW5ncmVzbykgJT4lDQogIHN1bW1hcmlzZV9hbGwofnN1bShyZWhvc3Bfb21zKSkgJT4lDQogICAgZ2dwbG90KA0KICAgICAgYWVzKA0KICAgICAgICB4PWZlY2hhX2luZ3Jlc28sIA0KICAgICAgICB5PXJlaG9zcF9vbXMpKSArDQogICAgZ2VvbV9wb2ludChjb2xvcj0iIzk5Q0NGRiIsIA0KICAgICAgc2l6ZT0yKSArIA0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKHRpdGxlID0gIk51bWVybyBSZWhvc3AgZW4gZWwgdGllbXBvIiwNCiAgICAgICAgeD0gIkZlY2hhIFJlaG9zcC4iLA0KICAgICAgICB5ID0gIk51bS4gUmVob3NwLiIpICsNCiAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAtPiBwMTMNCiANCnAxMyA8LSBnZ3Bsb3RseShwMTMpDQpwMTMNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMiBpZD0iUGVyZGlkb3MiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBtYXJrZG93bj0iMSI+R2VuZXJhbGlkYWRlczwvaDI+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRW4gbGEgZ3LDoWZpY2Egc2lndWllbnRlIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGhheSBlbiB0b3RhbCA0IHZhcmlhYmxlcyBxdWUgY29udGllbmVuIHJlZ2lzdHJvcyB2YWNpb3M6IGVzdHJhdG8sIGVzdGFkbyBjaXZpbCwgaW5ncmVzbyB5IHByb3ZlZWRvci4NCg0KQSBuaXZlbCBpbmRpdmlkdWFsIGVsIHBvcmNlbnRhamUgZGUgdmFsb3JlcyBwZXJkaWRvcyBwYXJhIHRvZG9zIGxvcyBjYXNvcyBlcyBzdXBlcmlvciBhbCAyNSUuIERlIGZvcm1hIGNvbWJpbmFkYSBoYXkgbcOhcyBkZWwgMzAlIGRlIGNhbXBvcyB2YWPDrW9zOyBwb3IgZW5kZSBubyBwb2RlbW9zIGRlY2lyIHF1ZSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGZhbHRlIHVuIHZhbG9yIGRlcGVuZGUgc29sbyBkZWwgdmFsb3Igb2JzZXJ2YWRvLCB5IHVzYXIgdW4gbcOpdG9kbyBwYXJhIGltcHV0YXJsbyAobGEgZm9ybWEgbm8gZXMgYWxlYXRvcmlhKS48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBldmFsID1UUlVFLCBlY2hvID0gRkFMU0V9DQphZ2dyKGRhdGFfcmVob3NwLA0KICAgICBjb2wgPSBjKCIjQ0NFNUZGIiwgIiM5OUNDRkYiKSwNCiAgICAgY2V4LmF4aXMgPSAwLjcsDQogICAgIHByb3AgPSBjKFRSVUUsIEZBTFNFKSwNCiAgICAgbnVtYmVyID0gVFJVRSwNCiAgICAgZ2FwID0gMS41LA0KICAgICBib3JkZXIgPSBOQSwNCiAgICAgYmFycyA9IEZBTFNFLA0KICAgICB5bGFiID0gYygiUHJvcG9yY2nDs24gZGUgRGF0b3MgUGVyZGlkb3MiLCAiQ29tYmluYWNpb25lcyIpKQ0KYGBgDQoNCjxkaXYgc3R5bGU9ICJ0ZXh0LWFsaWduOmp1c3RpZnkiPjwvZGl2Pg0KRGFkbyBsbyBhbnRlcmlvciwgc2UgaGFjZSBuZWNlc2FyaW8gY29uc3RydWlyIHVuYSB0ZXJjZXJhIGNhdGVnb3LDrWEsIHBvciBsbyBtZW5vcyBwYXJhIGxhcyB2YXJpYWJsZXMgcXVlIHBvc2VlbiBtZW5vcyBjYW1wb3MgdmFjw61vcyAoZXN0cmF0byB5IGVzdGFkbyBjaXZpbCkuDQoNClBhcmEgZXN0aW1hciBzaSBleGlzdGUgdW5hIGFzb2NpYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgcXVlIHB1ZWRhIGRlcml2YXJzZSBlbiBjb2xpbmVhbGlkYWQsIHNlIHByb2NlZGUgcHJpbWVybyBhIHZlcmlmaWNhciBxdWUgbGFzIHZhcmlhYmxlcyBubyBwb3NlZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCB1bmEgdmV6IHJlYWxpemFkbyBlc3RvLCBzZSBlbGlnZSBlbCB0ZXN0IGRlIFNwZWFybWFuIHBhcmEgaGFsbGFyIGxhIGNvcnJlbGFjacOzbiBsaW5lYWwgcG9yIGF0cmlidXRvLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCmRhdGFfcmVob3NwICU+JQ0KICBzZWxlY3QocGFnb19ob3NwLCANCiAgICAgICAgIGRpYXNfdWNpLA0KICAgICAgICAgZGlhc191Y2UsDQogICAgICAgICBkaWFzX2hvc3AsDQogICAgICAgICByZWhvc3Bfb21zKSAtPiBkYXRhX251bQ0KDQpub3JtX3Rlc3QgPC0gbGFwcGx5KGRhdGFfbnVtLCBsaWxsaWUudGVzdCkNCmxyZXMgPC0gc2FwcGx5KG5vcm1fdGVzdCwgYFtgLCBjKCJzdGF0aXN0aWMiLCJwLnZhbHVlIikpDQp0KGxyZXMpDQpgYGANCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+DQpMb3MgcmVzdWx0YWRvcyBjb25maXJtYW4gcXVlIG5pbmd1bmEgZGUgbGFzIHZhcmlhYmxlcyBwZXNlbnRhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCB5IGxhcyBjb3JyZWxhY2lvbmVzIHJlbGFjaW9uYWRhcyBhIGNvbnRpbnVhY2nDs24sIHZlcmlmaWNhbiBwb3NpYmxlcyBhc29jaWFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcyBkZSBsb3MgZMOtYXMgZW4gcXVlIGVsIHBhY2llbnRlIGVzdHV2byBpbnRlcm5hZG8gZW4gbGEgVW5pZGFkIGRlIEN1aWRhZG9zIEludGVuc2l2b3MsIGVuIGxhIFVuaWRhZCBkZSBDdWlkYWRvcyBFc3BlY2lhbGVzIHkgbG9zIGTDrWFzIHF1ZSBlbCBwYWNpZW50ZSBlc3R1dm8gaG9zcGl0YWxpemFkby4gUG9yIGNvbm9jaW1pZW50byBkZSBmYWN0bywgbGEgcmVsYWNpw7NuIGVudHJlIGxhIHZhcmlhYmxlICJkaWFzX3VjaSIgeSAiZGlhc191Y2UiIGVzIGVudGVuZGlibGUsIHlhIHF1ZSBjdWFuZG8gdW4gcGFjaWVudGUgcXVlIGhhIHBhc2FkbyBwb3IgbGEgVW5pZGFkIGRlIEN1aWRhZG9zIEludGVuc2l2b3MgcGFzw7Mgc3UgbW9tZW50byBkZSBjcmlzaXMgeSBzdSBlc3RhZG8gZGUgc2FsdWQgZXMgbcOhcyBlc3RhYmxlLCBzdWVsZSBzZXIgcmVtaXRpZG8gYSBsYSBVbmlkYWQgZGUgQ3VpZGFkb3MgRXNwZWNpYWxlcy4gPC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KY29ycl9udW0gPC0gcm91bmQoY29yKGRhdGFfbnVtKSw0KQ0KcC5tYXQgPC0gY29yX3BtYXQoZGF0YV9udW0sIG1ldGhvZCA9ICJzcGVhcm1hbiIpDQoNCmdnY29ycnBsb3QoY29ycl9udW0sIA0KICAgICAgICAgICB0eXBlID0gImxvd2VyIiwNCiAgICAgICAgICAgb3V0bGluZS5jb2wgPSAid2hpdGUiLA0KICAgICAgICAgICBwLm1hdCA9IHAubWF0LA0KICAgICAgICAgICBzaWcubGV2ZWwgPSAwLjA1LA0KICAgICAgICAgICBnZ3RoZW1lID0gZ2dwbG90Mjo6dGhlbWVfbWluaW1hbCwNCiAgICAgICAgICAgbGFiID0gVFJVRSwNCiAgICAgICAgICAgY29sb3JzID0gYygiIzk5Q0NGRiIsICJ3aGl0ZSIsICIjMDA2NkNDIikpICsgDQogIGxhYnModGl0bGUgPSAiQ29ycmVsYWNpb24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXMiKQ0KYGBgDQoNCjxkaXYgc3R5bGU9ICJ0ZXh0LWFsaWduOmp1c3RpZnkiPjwvZGl2Pg0KU2luIGVtYmFyZ28sIGxhcyBjb3JyZWxhY2lvbmVzIG9idGVuaWRhcyBubyBjdW1wbGVuIHVuIHVtYnJhbCBzdWZpY2llbnRlIHBhcmEgY29uc2lkZXJhcmxhcyBpbXBvcnRhbnRlcywgcG9yIGVuZGUgc2UgcHJvY2VkZSBhIGNvbnNlcnZhcmxhcyB5IGV2YWx1YXIgbcOhcyBhZGVsYW50ZSBzaSBlcyBwcmVjaXNvIGVsaW1pbmFybGFzIGRlZmluaXRpdmFtZW50ZS4gUG9yIG90cm8gbGFkbywgbGEgdmFyaWFibGUgY2F0ZWdvcsOtYSB5IGRpYWduw7NzdGljbyBlc3TDoW4gYWx0YW1lbnRlIGNvcnJlbGFjaW9uYWRhcyBjb24gbGEgdmFyaWFibGUgZW5kw7NnZW5hLCBwb3IgbG8gcXVlIGVzIG5lY2VzYXJpbyBlbGltaW5hcmxhcyBkZWwgYW7DoWxpc2lzLCBwYXJhIG5vIGluY3VycmlyIGVuIHBvc2libGVzIHNvYnJlYWp1c3RlcyBlbiBsYSBldGFwYSBkZSBtb2RlbGFkby4NCg0KQ29tbyBzZSBoYWLDrWEgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgYW7DoWxpc2lzIGRlIGRhdG9zIHBlcmRpZG9zIG8gbnVsb3MsIHNlIGRlY2lkZSBkZXNjYXJ0YXIgbGEgdmFyaWFibGUgaW5ncmVzbyB5YSBxdWUgY29udGllbmUgbWFzIGRlIHVuIDMwJSBlbiBkYXRvcyBwZXJkaWRvcy48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCmRhdGFfcmVob3NwICU+JQ0KICBtdXRhdGUoZXN0cmF0byA9IGlmZWxzZShpcy5uYShlc3RyYXRvKSB8IGVzdHJhdG8gPT0gLTEgfCBlc3RyYXRvID09IDAsICJTaW4gSW5mb3JtYWNpb24iLCBlc3RyYXRvKSwNCiAgICAgICAgIGVzdF9jaXZpbCA9IGlmZWxzZShpcy5uYShlc3RfY2l2aWwpLCAiU2luIEluZm9ybWFjaW9uIiwgZXN0X2NpdmlsKSwNCiAgICAgICAgIGluZ3Jlc28gPSBpZmVsc2UoaXMubmEoaW5ncmVzbyksICJTaW4gSW5mb3JtYWNpb24iLCBpbmdyZXNvKSwNCiAgICAgICAgIHByb3ZlZWRvciA9IGlmZWxzZShpcy5uYShwcm92ZWVkb3IpLCAiU2luIEluZm9ybWFjaW9uIiwgcHJvdmVlZG9yKSwNCiAgICAgICAgIHF1aXJ1ciA9IGlmZWxzZShxdWlydXIgPT0gMSwgJ1NpJywgJ05vJyksDQogICAgICAgICBlZGFkID0gY2FzZV93aGVuKCBlZGFkIDw9IDMwIH4gIjE4LTMwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPj0gMzEgJiBlZGFkIDw9IDQwIH4gIjMxLTQwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPj0gNDEgJiBlZGFkIDw9IDUwIH4gIjQxLTUwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPj0gNTEgJiBlZGFkIDw9IDYwIH4gIjUxLTYwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPj0gNjEgJiBlZGFkIDw9IDcwIH4gIjYxLTcwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPj0gNzEgJiBlZGFkIDw9IDgwIH4gIjcxLTgwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPj0gODEgfiAiODErIiksDQogICAgICAgICBtYXJjYXMgPSBjdXQobWFyY2FzLCBicmVha3MgPSAoMDozKSoyLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUpLA0KICAgICAgICAgZXN0X2NpdmlsID0gYXMuZmFjdG9yKGVzdF9jaXZpbCksDQogICAgICAgICBnZW5lcm8gPSBhcy5mYWN0b3IoZ2VuZXJvKSwNCiAgICAgICAgIHF1aXJ1ciA9IGFzLmZhY3RvcihxdWlydXIpLA0KICAgICAgICAgcmFtbyA9IGFzLmZhY3RvcihyYW1vKSwNCiAgICAgICAgIGVkYWQgPSBhcy5mYWN0b3IoZWRhZCksDQogICAgICAgICBlc3RyYXRvID0gYXMuZmFjdG9yKGVzdHJhdG8pKSAlPiUNCiAgc2VsZWN0KC1kaWFnbm9zLCAtY2F0ZWdvcmlhLCAtZmVjaGFfaW5ncmVzbywgLWluZ3Jlc28sIC1wcm92ZWVkb3IsIC1jaXVkYWQpIC0+IGRhdGFfcmVob3NwDQoNCnN0cihkYXRhX3JlaG9zcCkNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMiBpZD0iQW5hbGlzaXMiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBtYXJrZG93bj0iMSI+QW7DoWxpc2lzIEV4cGxvcmF0b3JpbzwvaDI+DQoNCjxoMyBpZD0iQW5hbGlzaXNDb24iIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Im1hcmtkb3duPSIxIj5BbsOhbGlzaXMgdW5pdmFyaWFkbyAtIHZhcmlhYmxlcyBjb250aW51YXM8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVzIGV2aWRlbnRlIGxhIGV4aXN0ZW5jaWEgdGFtYmnDqW4sIGRlIHZhbG9yZXMgYXTDrXBpY29zIG11eSBtYXJjYWRvcyB0YW50byBlbiBlbCBudW3DqXJvIGRlIGTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs24sIGNvbW8gZW4gbG9zIG7Dum1lcm9zIGRlIGTDrWFzIHF1ZSBlbCBwYWNpZW50ZSBlc3R1dm8gZW4gbGEgVW5pZGFkIGRlIEN1aWRhZG8gSW50ZW5zaXZvcyB5IEVzcGVjaWFsZXMsIGVuIGTDs25kZSBsb3MgdmFsb3JlcyBhdMOtcGljb3MgbcOhcyBncmFuZGVzIHN1Y2VkZW4gZW4gbG9zIGV2ZW50b3MgcXVlIG5vIGRlc2VuY2FkZW5hcm9uIGVuIHJlaG9zcGl0YWxpemFjacOzbi48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCmRhdGFfcmVob3NwICU+JQ0KICBmaWx0ZXIoZGlhc191Y2kgPiAwKSAlPiUNCiAgZ2dwbG90ICguLCBhZXMgKCBkaWFzX3VjaSwgY29sb3IgPSBhcy5mYWN0b3IocmVob3NwX29tcykpKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGw9IndoaXRlIiwgYWxwaGE9MC41LCBwb3NpdGlvbj0iaWRlbnRpdHkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeCA9ICJEw61hcyBVQ0kiLCANCiAgICAgICB5ID0gIkZyZWN1ZW5jaWEgUmVsYXRpdmEiLCANCiAgICAgICBmaWxsID0gIiAiKSArDQogIGdndGl0bGUoIkTDrWFzIGVuIFVuaWRhZCBkZSBDdWlkYWRvcyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgDQogICAgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAtPiBwMQ0KDQpkYXRhX3JlaG9zcCAlPiUNCiAgZmlsdGVyKGRpYXNfdWNlID4gMCkgJT4lDQogIGdncGxvdCAoLiwgYWVzICggZGlhc191Y2UsIGNvbG9yID0gYXMuZmFjdG9yKHJlaG9zcF9vbXMpKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsPSJ3aGl0ZSIsIGFscGhhPTAuNSwgcG9zaXRpb249ImlkZW50aXR5IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHggPSAiRMOtYXMgVUNFIiwgDQogICAgICAgeSA9ICJGcmVjdWVuY2lhIFJlbGF0aXZhIiwgDQogICAgICAgZmlsbCA9ICJSZWhvc3BpdGFsaXphY2nDs24iKSArDQogIGdndGl0bGUoIk7Dum1lcm8gZGUgZMOtYXMgZW4gVW5pZGFkIGRlIEN1aWRhZG9zIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSAtPiBwMg0KDQpwMSA8LSBnZ3Bsb3RseShwMSkNCnAyIDwtIGdncGxvdGx5KHAyKQ0KDQpzdWJwbG90KHAxLCBwMiwgdGl0bGVYID0gVFJVRSwgdGl0bGVZID0gVFJVRSkgJT4lDQogIGxheW91dChzaG93bGVnZW5kID0gKEZBTFNFKSkNCmBgYA0KDQo8ZGl2IHN0eWxlPSAidGV4dC1hbGlnbjpqdXN0aWZ5Ij48L2Rpdj4NCkNvbiBlbCBhbsOhbGlzaXMgYW50ZXJpb3Igbm8gc8OzbG8gc2UgbG9ncmEgaWRlbnRpZmljYXIgbGEgcHJlc2VuY2lhIGRlIHZhbG9yZXMgYXTDrXBpY29zLCBzaW5vIHF1ZSB0YW1iacOpbiBlcyBwb3NpYmxlIGV2aWRlbmNpYXIgcXVlIGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGFsdGFtZW50ZSBkZXNiYWxhbmNlYWRvcy4gRW4gZWwgY2FzbyBkZSBsb3Mgb3V0bGllcnMgc2UgdHJ1bmNhcsOhIGVuIGxvcyBjYXNvcyBlbiBxdWUgc2VhIG5lY2VzYXJpbywgaW1wdXRhbmRvIGxvcyB2YWxvcmVzIHF1ZSBzdXBlcmVuIGNpZXJ0byBsw61taXRlIGVuIGVsIHBlcmNlbnRpbCwgdGFudG8gbWF5b3IgY29tbyBtZW5vci48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpkYXRhX3JlaG9zcCAlPiUNCiAgbXV0YXRlKHBhZ29faG9zcCA9IGlmZWxzZShxdWlydXIgPT0gIlNpIiAmIHJlaG9zcF9vbXMgPT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHF1aXJ1ciA9PSAiU2kiICYgcmVob3NwX29tcyA9PSAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJwYWdvX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45NyksIHBhZ29faG9zcCksDQogICAgICAgICBwYWdvX2hvc3AgPSBpZmVsc2UocXVpcnVyID09ICJTaSIgJiByZWhvc3Bfb21zID09IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCBxdWlydXIgPT0gIlNpIiAmIHJlaG9zcF9vbXMgPT0gMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJwYWdvX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45OCksIHBhZ29faG9zcCksDQogICAgICAgICBwYWdvX2hvc3AgPSBpZmVsc2UocXVpcnVyID09ICJObyIgJiByZWhvc3Bfb21zID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCBxdWlydXIgPT0gIk5vIiAmIHJlaG9zcF9vbXMgPT0gMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAicGFnb19ob3NwIiwgcV9taW4gPSAwLCBxX21heCA9IDAuOTcpLCBwYWdvX2hvc3ApLCANCiAgICAgICAgIHBhZ29faG9zcCA9IGlmZWxzZShxdWlydXIgPT0gIk5vIiAmIHJlaG9zcF9vbXMgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHF1aXJ1ciA9PSAiTm8iICYgcmVob3NwX29tcyA9PSAxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJwYWdvX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45OCksIHBhZ29faG9zcCksDQogICAgICAgICBkaWFzX2hvc3AgPSBpZmVsc2UocmVob3NwX29tcyA9PSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaWVyKG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgcmVob3NwX29tcyA9PSAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiZGlhc19ob3NwIiwgcV9taW4gPSAwLCBxX21heCA9IDAuOTkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCByZWhvc3Bfb21zID09IDEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJkaWFzX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45OSkpLA0KICAgICAgICAgZGlhc191Y2kgPSBpZmVsc2UocmVob3NwX29tcyA9PSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCByZWhvc3Bfb21zID09IDAgJiBkaWFzX3VjaSA+IDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJkaWFzX3VjaSIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk5OSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZGlhc191Y2kpLA0KICAgICAgICAgZGlhc191Y2UgPSBpZmVsc2UocmVob3NwX29tcyA9PSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCByZWhvc3Bfb21zID09IDAgJiBkaWFzX3VjZSA+IDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJkaWFzX3VjZSIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk5OSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZGlhc191Y2kpKSAtPiBkYXRhX3JlaG9zcA0KYGBgDQoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCnAzIDwtIG15Ym94cGxvdChteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHBhZ29faG9zcCA+IDApLCANCiAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAicGFnb19ob3NwIiwgDQogICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJQYWdvIGhvc3BpdGFsaXphY2nDs24iLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIlBhZ28gRGlhZyIsIA0KICAgICAgICAgICAgICAgIG15X2ZpbGwgPSAiIikNCg0KcDQgPC0gbXlib3hwbG90KG15ZGF0YSA9IGRhdGFfcmVob3NwLCANCiAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAiZGlhc19ob3NwIiwgDQogICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJUb3RhbCBkaWFzIGhvc3BpdGFsaXphZG8iLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkRpYXMgaG9zcGl0YWxpemFjacOzbiIsIA0KICAgICAgICAgICAgICAgIG15X2ZpbGwgPSAiIikNCg0KcDUgPC0gbXlib3hwbG90KG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgZGlhc191Y2kgPiAwKSwgDQogICAgICAgICAgICAgICAgbXlleHBvc3VyZSA9ICJyZWhvc3Bfb21zIiwgDQogICAgICAgICAgICAgICAgbXlvdXRjb21lID0gImRpYXNfdWNpIiwgDQogICAgICAgICAgICAgICAgbXl0aXRsZSA9ICAiVG90YWwgZMOtYXMgVUNJIiwgDQogICAgICAgICAgICAgICAgbXlsYWJlbF94ID0gIiIsIA0KICAgICAgICAgICAgICAgIG15bGFiZWxfeSA9ICJEaWFzIFVDSSIsIA0KICAgICAgICAgICAgICAgIG15X2ZpbGwgPSAiIikNCg0KcDYgPC0gbXlib3hwbG90KG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgZGlhc191Y2UgPiAwKSwgDQogICAgICAgICAgICAgICAgbXlleHBvc3VyZSA9ICJyZWhvc3Bfb21zIiwgDQogICAgICAgICAgICAgICAgbXlvdXRjb21lID0gImRpYXNfdWNlIiwgDQogICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJUb3RhbCBkw61hcyBVQ0UiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkRpYXMgVUNFIiwgDQogICAgICAgICAgICAgICAgbXlfZmlsbCA9ICIiKQ0KDQpwMyA8LSBnZ3Bsb3RseShwMykNCnA0IDwtIGdncGxvdGx5KHA0KQ0KcDUgPC0gZ2dwbG90bHkocDUpDQpwNiA8LSBnZ3Bsb3RseShwNikNCg0Kc3VicGxvdChwNSwgcDYsIHAzLCBwNCwgDQogICAgICAgIG5yb3dzID0gMiwgbmNvbCgyKSwgDQogICAgICAgIHRpdGxlWCA9IFRSVUUsIHRpdGxlWSA9IFRSVUUpICU+JQ0KICBsYXlvdXQoc2hvd2xlZ2VuZCA9IChGQUxTRSkpDQoNCg0KDQpgYGANCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+PC9kaXY+DQpTZSBwdWVkZSBvYnNlcnZhciBxdWUgZW4gbGEgdmFyaWFibGUgZMOtYXMgVUNJLCBjb3JyZXNwb25kaWVudGUgYWwgcHJpbWVyIGRpYWduw7NzdGljbywgbm8gcGFyZWNlIGhhYmVyIHVuYSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGEgZGlzdHJpYnVjacOzbiBhbCBkaXNjcmltaW5hciBwb3IgbGEgdmFyaWFibGUgb2JqZXRpdm8gYmluYXJpYSwgZXMgZGVjaXIsIGVudHJlIGxvcyBjYXNvcyBkZSByZWhvc3BpdGFsaXphY2nDs24gKDEpIHkgY2Fzb3MgZGUgbm8gcmVob3NwaXRhbGl6YWNpw7NuICgwKS4gQWRpY2lvbmFsbWVudGUsIGxhIGRpc3RpYnVjacOzbiBlbiBhbWJhcyB2YXJpYWJsZXMgbm8gZXMgc2ltw6l0cmljYS4gDQoNCkEgcGVzYXIgZGUgcXVlIGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGJhc3RhbnRlIGRpc3BlcnNvcywgc2UgbG9ncmEgaWRlbnRpZmljYXIgZGlmZXJlbmNpYXMgZW4gbGEgdmFyaWFibGUgZGVsIHBhZ28gLWNvbiB2YWxvcmVzIG3DoXMgYWx0b3MgZW4gbG9zIGNhc28gZW4gcXVlIG5vIHRlcm1pbsOzIGRlIGJ1ZXZvIGhvc3BpdGFsaXphZG8sIHkgZW4gZWwgY2Fzw7MgZGVsIG7Dum1lcm8gZGUgZMOtYXMgaG9zcGl0YWxpemFkbyBsb3MgcmFuZ29zIHNvbiBtdWNobyBtw6FzIHBlcXVlw7FvcyBjdWFuZG8gaGF5IHVuYSByZWhvc3BpdGFsaXphY2nDs24uPC9kaXY+DQoNCjxocj4NCjxoMyBpZD0iQW5hbGlzaXNDYXIic3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiIG1hcmtkb3duID0gIjEiPkFuw6FsaXNpcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzPC9oMz4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpPYnNlcnZhbmRvIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGxhIGRpZmVyZW5jaWEgZW50cmUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBlbCBldmVudG8gb2N1cnJhIChoYXlhIHJlaG9zcGl0YWxpemFjacOzbikgbyBubywgc2UgcHVlZGUgZXZpZGVuY2lhciBzw7NsbyBlbiBhbGd1bmFzIGNsYXNlcyBwb3IgY2F0ZWdvcsOtYSwgcGVybyBlbiBnZW5lcmFsLCBsYXMgcHJvcG9yY2lvbmVzIHN1ZWxlbiBzZXIgYmFzdGFudGVzIHNpbWlsYXJlcywgcG9yIGxvIHF1ZSBubyBlcyBwb3NpYmxlIGVsYWJvcmFyIGEgcHJpb3JpIHVuYSBoaXDDs3Rlc2lzIHF1ZSBlc3RpcHVsZSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsYXMgZGlzdHJpYnVjaW9uZXMsIHBvciBsbyBtZW5vcyBwYXJhIG5pbmd1bmEgZGUgbGFzIGRvcyB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIGVuIGVsIGdyw6FmaWNvIGEgY29udGludWFjacOzbi48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCnA3IDwtIG15Z2VvbV9iYXIobXlkYXRhID0gZGF0YV9yZWhvc3AsIA0KICAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gImVkYWQiLCANCiAgICAgICAgICAgICAgICAgbXlvdXRjb21lID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJFZGFkIiwgDQogICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkZyZWN1ZW5jaWEiLCANCiAgICAgICAgICAgICAgICAgbXlfZmlsbCA9ICJSZWhvc3BpdGFsaXphY2nDs24iLCANCiAgICAgICAgICAgICAgICAgbXlfYW5nbGUgPSBOVUxMLA0KICAgICAgICAgICAgICAgICBteV9sZWdlbmQgPSAicmlnaHQiKQ0KDQpwOCA8LSBteWdlb21fYmFyKG15ZGF0YSA9IGRhdGFfcmVob3NwLCANCiAgICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAiZXN0cmF0byIsIA0KICAgICAgICAgICAgICAgICAgbXlvdXRjb21lID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICAgIG15dGl0bGUgPSAiRXN0cmF0byIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF94ID0gIiIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkZyZWN1ZW5jaWEiLCANCiAgICAgICAgICAgICAgICAgIG15X2ZpbGwgPSAiUmVob3NwaXRhbGl6YWNpw7NuIiwgDQogICAgICAgICAgICAgICAgICBteV9hbmdsZSA9IE5VTEwsDQogICAgICAgICAgICAgICAgICBteV9sZWdlbmQgPSAibm9uZSIpDQoNCmdyaWQuYXJyYW5nZShwNywNCiAgICAgICAgICAgICBwOCkNCg0KYGBgDQoNCjxkaXYgc3R5bGU9ICJ0ZXh0LWFsaWduOmp1c3RpZnkiPjwvZGl2Pg0KUG9yIG90cm8gbGFkbywgZWwgYXRyaWJ1dG8gcXVlIGluZGljYSBlbCBoZWNobyBkZSBxdWUgc2UgaGF5YW4gcmVhbGl6YWRvIHByb2NlZGltaWVudG9zIHF1aXLDunJnaWNvcyBkdXJhbnRlIGxhIHByaW1lcmEgaG9zcGl0YWxpemFjacOzbiBtdWVzdHJhbiBjaWVydGEgZGlmZXJlbmNpYSBlbiBsYSBkaXN0cmlidWnDs24gcG9yIGdydXBvOyBlcyBtw6FzIHByb2JhYmxlIHF1ZSBsYSBwZXJzb25hIGRlYmEgc2VyIHJlaG9zcGl0YWxpemFkYSBkZSBudWV2by48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCnA5IDwtIG15Z2VvbV9iYXIobXlkYXRhID0gZGF0YV9yZWhvc3AsIA0KICAgICAgICAgICAgICAgICAgbXlleHBvc3VyZSA9ICJxdWlydXIiLCANCiAgICAgICAgICAgICAgICAgIG15b3V0Y29tZSA9ICJyZWhvc3Bfb21zIiwgDQogICAgICAgICAgICAgICAgICBteXRpdGxlID0gIlByb2MgcXVpcsO6cmdpY28iLCANCiAgICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICAgIG15bGFiZWxfeSA9ICJGcmVjdWVuY2lhIiwgDQogICAgICAgICAgICAgICAgICBteV9maWxsID0gIlJlaG9zcGl0YWxpemFjacOzbiIsIA0KICAgICAgICAgICAgICAgICAgbXlfYW5nbGUgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgbXlfbGVnZW5kID0gInJpZ2h0IikNCg0KcDEwIDwtIG15Z2VvbV9iYXIobXlkYXRhID0gZGF0YV9yZWhvc3AsIA0KICAgICAgICAgICAgICAgICAgbXlleHBvc3VyZSA9ICJlc3RfY2l2aWwiLCANCiAgICAgICAgICAgICAgICAgIG15b3V0Y29tZSA9ICJyZWhvc3Bfb21zIiwgDQogICAgICAgICAgICAgICAgICBteXRpdGxlID0gIkVzdGFkbyBjaXZpbCIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF94ID0gIiIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkZyZWN1ZW5jaWEiLCANCiAgICAgICAgICAgICAgICAgIG15X2ZpbGwgPSAiUmVob3NwaXRhbGl6YWNpw7NuIiwgDQogICAgICAgICAgICAgICAgICBteV9hbmdsZSA9IE5VTEwsDQogICAgICAgICAgICAgICAgICBteV9sZWdlbmQgPSAicmlnaHQiKQ0KDQpncmlkLmFycmFuZ2UocDksDQogICAgICAgICAgICAgIHAxMCwNCiAgICAgICAgICAgICAgbmNvbCA9IDEsDQogICAgICAgICAgICAgIG5yb3cgPSAyKQ0KDQpgYGANCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+PC9kaXY+DQpDb24gZWwgb2JqZXRpdm8gZGUgZW5yaXF1ZWNlciBlbCBhbsOhbGlzaXMgZXhwbG9yYXRvcmlvLCBzZSBjYWxjdWxhcsOhbiBkb3MgbWVkaWRhcyBtdXkgY29tw7puZXMgZGUgbGEgdGVvcsOtYSBkZSBsYSBpbmZvcm1hY2nDs24sIMOpc3RhcyBwZXJtaXRlbiBpbmZlcmlyIGFsZ28gZGVsIHBvZGVyIHByZWRpY3Rpdm8gcXVlIHB1ZWRlbiB0ZW5lciBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLCBhbnRlcyBkZSBoYWNlciBwYXJ0ZSBkZSB1biBtb2RlbG8uPC9kaXY+DQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KPGhyPg0KPGgyIGlkPSJBbmFsaXNpc1dPRSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiIG1hcmtkb3duID0iMSI+QW7DoWxpc2lzIGRlIGNsYXNpZmljYWNpw7NuIGJpbmFyaWEgdXNhbmRvIFdPRSB5IGVsIElWPC9oMj4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFbCBwZXNvIGRlIGxhIGV2aWRlbmNpYSAoV09FKSB5IGVsIHZhbG9yIGRlIGxhIGluZm9ybWFjacOzbiAoSVYpIGF5dWRhbiwgZW50cmUgb3RyYXMgY29zYXMsIGEgZGV0ZXJtaW5hciBsYSBjb250cmlidWNpw7NuIGluZGVwZW5kaWVudGUgZGUgY2FkYSB2YXJpYWJsZSBhbCByZXN1bHRhZG8sIHkgZGV0ZWN0YXIgcmVsYWNpb25lcyBsaW5lYWxlcyB5IG5vIGxpbmVhbGVzLiBFbCBXT0UgbWlkZSBsYSByZWxhY2nDs24gZW50cmUgbGEgdmFyaWFibGUgcHJlZGljdGl2YSB5IGVsIG9iamV0byBiaW5hcmlvLCBtaWVudHJhcyBxdWUgZWwgSVYgbWlkZSBsYSBmdWVyemEgcHJlZGljdGl2YSBkZSBlc2EgcmVsYWNpw7NuLg0KDQpMYSB0YWJsYSBhIGNvbnRpbnVhY2nDs24gY29udGllbmUgbG9zIHZhbG9yZXMgZGVsICJ2YWxvciBkZSBsYSBpbmZvcm1hY2nDs24iIGNvbiB5IHNpbiBlbCBhanVzdGUgZGVyaXZhZG8gZGUgbGEgdmFsaWRhY2nDs24gY3J1emFkYS4gQ3VhbmRvIHNlIHJlYWxpemEgZWwgYWp1c3RlIGNvbiBlbCBvYmpldGl2byBkZSBxdWUgbG9zIHJlc3VsdGFkb3Mgc2VhbiBtw6FzIGVzdGFibGVzLCB0YW50byBwYWdvIGRlbCBkaWFnbsOzc3RpY28sIGVsIGhlY2hvIGRlIHF1ZSBlbCBwYWNpZW50ZSBoYWxsYSBwYXNhZG8gcG9yIGxhIFVuaWRhZCBkZSBjdWlkYWRvcywgeSBzaSBmdWVyb24gcmVhbGl6YWRvcyBwcm9jZWRpbWllbnRvcyBxdWlyw7pyZ2ljb3Mgc2Vyw6FuIGxhcyDDum5pY2FzIHZhcmlhYmxlcyBjb24gc3VmaWNpZW50ZSBjYXBhY2lkYWQgZGUgcHJlZGljY2nDs24gYSBuaXZlbCBpbmRpdmlkdWFsIHkgdW5pdmFyaWFibGUgKEl2ID4gMC4wNSkuIEN1YW5kbyBzZSByZWxhamEgZWwgc3VwdWVzdG8sIElWIHNpbiByZXN0YXIgZWwgcGVuYWx0eSwgc2UgaW5jbHVpcsOtYW4gbG9zIGTDrWFzIGVuIHF1ZSBlc3R1dm8gaG9zcGl0YWxpemFkby48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpzZXQuc2VlZCgxMjM0KQ0KZGF0YV9yZWhvc3AgPC0gZGF0YV9yZWhvc3AgJT4lDQogIG11dGF0ZShpZCA9IDE6bnJvdyguKSkgDQoNCmRhdGFfcmVob3NwICU+JQ0KICBzYW1wbGVfZnJhYyhzaXplID0gLjcwKSAtPiB0cmFpbg0KDQpkYXRhX3JlaG9zcCAlPiUNCiAgYW50aV9qb2luKHggPSAuLA0KICAgICAgICAgICAgeSA9IHRyYWluLCANCiAgICAgICAgICAgIGJ5ID0gImlkIikgLT4gdGVzdA0KICANCnRyYWluIDwtIHNlbGVjdCguZGF0YSA9IHRyYWluLCAtaWQpDQp0ZXN0IDwtIHNlbGVjdCguZGF0YSA9IHRlc3QsIC1pZCkNCg0KSVYgPC0gY3JlYXRlX2luZm90YWJsZXMoZGF0YSA9IHRyYWluLA0KICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdGVzdCwNCiAgICAgICAgICAgICAgICAgICB5ID0gInJlaG9zcF9vbXMiKQ0KDQprYWJsZV9zdHlsaW5nKGthYmxlKElWJFN1bW1hcnkpLCANCiAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgIHJvd19sYWJlbF9wb3NpdGlvbiA9IDEsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQo8ZGl2IHN0eWxlPSAidGV4dC1hbGlnbjpqdXN0aWZ5Ij4NCkRlIGFjdWVyZG8gYWwgcG9kZXIgcHJlZGljdGl2byBkZSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzLCBzZSBlbGlnZW4gYXF1ZWxsYXMgY3V5byBWYWxvciBkZSBsYSBpbmZvcm1hY2nDk24gKElWKSBzZWEgc3VwZXJpb3IgYWwgMiUgKDAsMDIpLiBMYXMgdmFyaWFibGVzIGNvbiBJViBpbmZlcmlvcmVzIGEgZXN0ZSB2YWxvciBzZSBjb25zaWRlcmFuIGltcHJlZGljdGl2YXMgeSBzZSBkZWNpZGUgZGVzY2FydGFybGFzLiBMYXMgdmFyaWFibGVzIHF1ZSBjb250aW51YW4sIGVuIG9yZGVuIGRlIHJlbGV2YW5jaWEgc2VndW4gc3UgcG9kZXIgcHJlZGljdG9yLCBzb246DQoNCjx1bD4NCjxsaT5wYWdvX2hvc3A8L2xpPg0KPGxpPnF1aXJ1cjwvbGk+DQo8bGk+ZGlhc191Y2U8L2xpPg0KPGxpPmRpYXNfdWNpPC9saT4NCjxsaT5wcm92ZWVkb3I8L2xpPg0KPGxpPmRpYXNfaG9zcDwvbGk+DQo8bGk+ZWRhZDwvbGk+DQo8bGk+Z2VuZXJvPC9saT4NCjxsaT5jaXVkYWQ8L2xpPg0KPC91bD4NCg0KDQpTaW4gZW1iYXJnbywgdGFudG8gbGEgY2l1ZGFkLCBjb21vIGVsIHByb3ZlZWRvciBubyBzZXLDoW4gdGVuaWRvcyBlbiBjdWVudGEsIHBvciBxdWUgcHVlZGVuIGxsZWdhciBhIGNvbmRpY2lvbmFyIG51ZXN0cmEgdmFyaWFibGUgb2JqZXRpdm8uIEFkaWNpb25hbG1lbnRlLCBsbyBkw61hcyBVQ0UgeSBVQ0kgcGFyZWNlbiBlc3RhciBhbHRhbWVudGUgY29ycmVsYWNpb25hZG9zIGNvbiBsYSB2YXJpYWJsZSBvYmpldGl2bywgZ2VuZXJhbmRvIHVuYSBzb2JyZXByZWRpY2Npw7NuLiBTZSBldmFsw7phIGFkZW1hcyBsYXMgY29uZGljaW9uZXMgcXVlIHBlcm1pdGVuIGdlbmVyYXIgZXN0YXMgZG9zIHVsdGltYXMgdmFyaWFibGVzIGVuY29udHJhbmRvIHF1ZSBzb2xvIHNlIGFsbWFjZW5hbiBjdWFuZG8gZWwgdmFsb3IgcGFnYWRvIGhhc3RhIGVsIG1vbWVudG8gZXMgY2VybzsgcG9yIHRvZG8gZXN0byBlc3RhcyBkb3MgdmFyaWFibGVzIHRhbXBvY28gc2Vyw6FuIHRlbmlkYXMgZW4gY3VlbnRhLg0KDQpFbmZvY2FuZG9ub3MgZW4gZWwgcGFnbyBkZWwgZGlhZ27Ds3N0aWNvLCBlbCBjdWFsLCBlcyB1bmEgZGUgbGFzIHZhcmlhYmxlcyBjb24gbWF5b3IgaW5mbHVlbmNpYSwgZWwgV09FIG5vcyBpbmRpY2EgdW5hIHJlbGFjacOzbiBubyBsaW5lYWwsIGNvbiB1biBpbmNyZW1lbnRvIGVuIGVsIFdPRSBhIG1lZGlkYSBxdWUgZGlzbWludXllIGVsIHJhbmdvIGRlIHBhZ28gZW4gZWwgZGlhZ27Ds3N0aWNvLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCmthYmxlX3N0eWxpbmcoa2FibGUoSVYkVGFibGVzJHBhZ29faG9zcCksIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgcm93X2xhYmVsX3Bvc2l0aW9uID0gMSwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpuIDwtIG5hbWVzKElWJFRhYmxlcykNCmZvciAoaSBpbiAxOmxlbmd0aChuKSl7DQogICBwbG90X2luZm90YWJsZXMoSVYsIG5baV0pfQ0KDQpNdWx0aVBsb3QoSVYsIElWJFN1bW1hcnkkVmFyaWFibGVbYygxLDIsMyw0LDYsMTApXSkNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMiBpZD0iTW9kZWxvIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPk1vZGVsbzwvYT48L2gyPg0KPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRWwgb2JqZXRpdm8gcHJpbmNpcGFsIGRlbCBhbsOhbGlzaXMgZXMgZXN0aW1hciB1biBtb2RlbG8gcHJlZGljdGl2byBjb24gZWwgY3XDoWwgc2UgcHVlZGEgZXN0aW1hciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIHBhY2llbnRlIHRlcm1pbmUgZW4gdW5hIHJlaG9zcGl0YWxpemFjacOzbiwgYXNvY2lhZGEgYSB1biBkaWFuZ8Ozc3RpY28gYW50ZXJpb3IuIFBhcmEgZWxsbyBzZSBlbXBsZWFyw6EgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbG9nw61zdGljYSwgZWwgY3XDoWwgZXMgYW1wbGlhbWVudGUgdXRpbGl6YWRvIHBhcmEgcmVzb2x2ZXIgcHJvYmxlbWFzIGRlIGNsYXNpZmljYWNpw7NuIGJpbmFyaWEuDQoNClVuYSB2ZXogc2UgcmVhbGl6YW4gbG9zIGZpbHRyb3MgZGUgY2FsaWRhZCB5IGNvbXBsZXRpdHVkLCB5IHRyYXMgbG8gb2J0ZW5pZG8gZW4gbG9zIHJlc3VsdGFkb3MgZGVsIFdPRSwgc2UgcHJvY2VkZSBhIHJlYWxpemFyIGxhIHNlbGVjY2lvbiBkZSB2YXJpYWJsZXMgcGFyYSBlbCBtb2RlbG8uIFNlIHRlbmRyw6FuIGVuIGN1ZW50YSBlbnRvbmNlcywgZWwgcGFnbyByZWFsaXphZG8sIGxvcyBkw61hcyBlbiBxdWUgZXN0dXZvIGVsIHBhY2llbnRlIGRlIGZvcm1hIGdlbmVyYWwsIGVsIGhlY2hvIGRlIHF1ZSBzZSBsZSBoYXlhIHJlYWxpemFkbyBvIG5vIHVuYSBjaXJ1Z8OtYSwgZWwgZ8OpbmVybywgbGEgZWRhZCB5IGVsIGVzdHJhdG8uDQoNClBhcmEgZXZhbHVhciBsYSBjYXBhY2lkYWQgZGUgZ2VuZXJhbGl6YWNpw7NuIGRlbCBtb2RlbG8sIHNlIGRpdmlkaXLDoSBlbCBjb25qdW50byBkZSBkYXRvcyBlbiBlbnRyZW5hbWllbnRvICg3MCUpIHkgcHJ1ZWJhICgzMCUpLg0KDQpUYW1iacOpbiB2YW1vcyBhIGVzY2FsYXIgbnVlc3RyYXMgdmFyaWFibGVzIG51bWVyaWNhcywgZGViaWRvIGEgcXVlIHRlbmVtb3MgdW5vcyB2YWxvcmVzIG11eSBhbHRvcyBlbiBlbCBwYWdvIGRlIGxhIGhvc3BpdGFsaXphY2nDs24gbG9zIGN1YWxlcyBwdWVkZW4gZ2VuZXJhciBpbmZsdWVuY2lhcyBlbiBlbCBtb2RlbG8gaGFjaWEgZXN0YSB2YXJpYWJsZS48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpzZXQuc2VlZCgxMjM0KQ0KDQpkYXRhX3JlaG9zcCAlPiUNCiAgc2VsZWN0KGlkLA0KICAgICAgICBwYWdvX2hvc3AsDQogICAgICAgIHF1aXJ1ciwNCiAgICAgICAgZGlhc19ob3NwLA0KICAgICAgICBnZW5lcm8sDQogICAgICAgIGVkYWQsDQogICAgICAgIGVzdHJhdG8sDQogICAgICAgIHJlaG9zcF9vbXMpIC0+IG1vZGVsX3JlaG9zcA0KDQptb2RlbF9yZWhvc3AgJT4lDQogIHNhbXBsZV9mcmFjKHNpemUgPSAwLjcpIC0+IHRyYWluaW5nDQoNCm1vZGVsX3JlaG9zcCAlPiUNCiAgYW50aV9qb2luKHggPSAuLA0KICAgICAgICAgICAgeSA9IHRyYWluaW5nLA0KICAgICAgICAgICAgYnkgPSAiaWQiKSAtPiB0ZXN0aW5nDQoNCnRlc3RpbmcgJT4lDQogIHNlbGVjdCgtaWQpIC0+IHRlc3RpbmcNCg0KdHJhaW5pbmcgJT4lDQogIHNlbGVjdCgtaWQpICU+JQ0KICBtdXRhdGUocmVob3NwX29tcyA9IGFzLmZhY3RvcihyZWhvc3Bfb21zKSkgLT4gdHJhaW5pbmcNCg0KdHJhaW5pbmcgPC0gdHJhaW5pbmcgJT4lIG11dGF0ZV9lYWNoXyhmdW5zKHNjYWxlKC4pICU+JSBhcy52ZWN0b3IpLCANCiAgICAgICAgICB2YXJzPWMoInBhZ29faG9zcCIsImRpYXNfaG9zcCIpKSANCg0KYGBgDQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KPGhyPg0KPGgzIGlkPSJTTU9URSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiIG1hcmtkb3duPSIxIj5TbW90ZTwvaDM+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KQ29tbyBzZSBoYWJpYSBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUsIGxhIGluZm9ybWFjaW9uIHNlIGVuY3VlbnRyYSBkZXNiYWxhbmNlYWRhOyBlc3RvIGVzLCB0ZW5pZW5kbyBlbiBjdWVudGEgcXVlIGVsIHByb2JsZW1hIGVuIHF1ZSBzZSBlc3RhIHRyYWJhamFuZG8gY29uc2lzdGUgZW4gbGEgY2xhc2lmaWNhY2lvbiBkZSB1bmEgdmFyaWFibGUgZGljb3TDs21pY2EsIHNlIGRlYmUgYW5hbGl6YXIgZWwgbml2ZWwgZGUgcmVwcmVzZW50YWNpb24gZGUgc3VzIHBvc2libGVzIHZhbG9yZXMgZGVudHJvIGRlbCBjb25qdW50byB0b3RhbCBkZSBkYXRvcy48L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCmthYmxlKGFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShtb2RlbF9yZWhvc3AkcmVob3NwX29tcykpKSkgJT4lDQprYWJsZV9zdHlsaW5nKHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICByb3dfbGFiZWxfcG9zaXRpb24gPSAxLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikgJT4lDQpyb3dfc3BlYygwLGJhY2tncm91bmQ9IiNFQkYwRjciKQ0KDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQpWZW1vcyBxdWUgbGEgcmVwcmVzZW50YWNpb24gcGFyYSBsYSBjYXRlZ29yw61hIHBvc2l0aXZhIGVzIHVuIHBvY28gbWFzIGRlbCAyJSBkZSBsYSBpbmZvcm1hY2nDs24uIEVuIGVzdGUgY2FzbyB2YW1vcyBhIHJlYWxpemFyIHVuIHRyYXRhbWllbnRvIHF1ZSBwZXJtaXRhIGF1bWVudGFyIGxhIGNsYXNlIG1pbm9yaXRhcmlhLCBzaW4gdXRpbGl6YXIgc29sdWNpb25lcyBnZW7DqXJpY2FzIGNvbW8gcmVkdWNpciBsYSBjbGFzZSBtYXlvcml0YXJpYSBhbCBuaXZlbCBkZSBsYSBjbGFzZSBtZW5vci4NCg0KUGFyYSBlbGxvLCB2YW1vcyBhIHV0aWxpemFyIGxhIHTDqWNuaWNhIFNNT1RFIChTeW50aGV0aWMgTWlub3JpdHkgT3ZlcnNhbXBsaW5nIE1ldGhvZCksIGxhIGN1YWwgZ2VuZXJhIG51ZXZhcyBpbnN0YW5jaWFzIGFydGlmaWNpYWxlcyBkZSBsYSBjbGFzZSBtw6FzIHBlcXVlw7FhIGludGVycG9sYW5kbyBsb3MgdmFsb3JlcyBkZSBsYXMgaW5zdGFuY2lhcyBtaW5vcml0YXJpYXMgbcOhcyBjZXJjYW5hcyBhIHVuYSBkYWRhLg0KDQpQb3IgbWVkaW8gZGUgU01PVEUgc2UgZ2VuZXJhcsOhIHVuIG51ZXZvIHNldCBkZSBkYXRvcyBkZSBlbnRyZW5hbWllbnRvLCBlbiBlbCBjdWFsIHNlIHRlbmdhIHVuIDYwJSBkZSBpbmZvcm1hY2lvbiBwYXJhIGxhIGNhdGVnb3JpYSBuZWdhdGl2YSAocmVob3NwX29tcyA9IDApIHkgNDAlIHBhcmEgbGEgY2F0ZWdvcmlhIHBvc2l0aXZhIChyZWhvc3Bfb21zID0gMCkuPC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KdHJhaW5pbmcgPC0gU01PVEUocmVob3NwX29tcyB+IC4sIGFzLmRhdGEuZnJhbWUodHJhaW5pbmcpLCBwZXJjLm92ZXIgPSAzNTAsIHBlcmMudW5kZXIgPSAxNTApDQojdHJhaW5pbmcgPC0gU01PVEUocmVob3NwX29tcyB+IC4sIGFzLmRhdGEuZnJhbWUodHJhaW5pbmcpLCBwZXJjLm92ZXIgPSAzMDAsIHBlcmMudW5kZXIgPSAyMDApDQpgYGANCg0KYGBge3J9DQpzdHIodHJhaW5pbmcpDQpgYGANCg0KDQpWZXJpZmljYW1vcyBxdWUgZWwgc2V0IGRlIGVudHJlbmFtaWVudG8gc2UgZW5jdWVudHJlIGJhbGFuY2VhZG86DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KDQprYWJsZV9zdHlsaW5nKGthYmxlKGFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZSh0cmFpbmluZyRyZWhvc3Bfb21zKSkpKSwgDQogICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICByb3dfbGFiZWxfcG9zaXRpb24gPSAxLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikgJT4lDQpyb3dfc3BlYygwLGJhY2tncm91bmQ9IiNFQkYwRjciKQ0KDQpgYGANCg0KW1ZvbHZlciBhbCDDjW5kaWNlXSgjaW5kaWNlKTwvZGl2Pg0KDQo8aHI+DQo8aDMgaWQ9IkFqdXN0ZW1vZCIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiIG1hcmtkb3duPSIxIj5BanVzdGUgZGVsIG1vZGVsbyB5IEVzdGltYWNpw7NuIGRlIHBhcsOhbWV0cm9zPC9oMz4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpEZWwgcmVzdWx0YWRvIGV4cGxvcmF0b3JpbyBhbnRlcmlvciwgYWwgZGlzY3JpbWluYXIgZWwgYW7DoWxpc2lzIGRlIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgcG9yIG51ZXN0cmEgdmFyaWFibGUgb2JqZXRpdm8gKFJlaG9zcGl0YWxpemFjacOzbiksIGVzIHBvc2libGUgZXZpZGVuY2lhciB1bmEgZGlmZXJlbmNpYSBjbGFyYSBlbnRyZSBsYXMgZGlzdHJpYnVjaW9uZXMgcGFyYSBsb3MgYXRyaWJ1dG9zOiBQYWdvL2Nvc3RvIGRlbCBwcm9jZWRpbWllbnRvIHkgbG9zIGTDrWFzIGVuIHF1ZSBlbCB1c3VhcmlvIGVzdHV2byBpbnRlcm5hZG8geWEgc2VhIGVuIGxhIFVuaWRhZCBkZSBDdWlkYWRvcyBJbnRlbnNpdm9zIG8gRXNwZWNpYWxlcy4gRXN0byBwb2Ryw61hIHNlciB1biBpbmRpY2lvIGRlIHF1ZSBlc3RhcyB2YXJpYWJsZXMgZW4gcGFydGljdWxhciwgcHVlZGVuIGxsZWdhciBhIHNlciByZWxldmFudGVzIHBhcmEgZXhwbGljYXIgbGEgcHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgZGVsIGV2ZW50bywgZXMgZGVjaXIsIGN1YW5kbyBodWJvIHVuYSBob3NwaXRhbGl6YWNpw7NuIHBvc3RlcmlvciBsaWdhZGEgYSB1biBkaWFnbsOzc3RpY28uDQoNCkEgY29udGludWFjacOzbiwgYWwgYWp1c3RhciBlbCBtb2RlbG8gb2J0ZW5lbW9zIGxvcyBzaWd1aWVudGVzIHJlc3VsdGFkb3M6PC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnJtKGxpc3Q9bHMoKVshbHMoKSAlaW4lIGMoInRyYWluaW5nIiwgInRlc3RpbmciLCAiZGF0YV9yZWhvc3AiKV0pDQpteWxvZ2l0IDwtIGdsbShyZWhvc3Bfb21zIH4gcGFnb19ob3NwICsgcXVpcnVyICsgZGlhc19ob3NwICsgZWRhZCArIGdlbmVybyArIGVzdHJhdG8sIGRhdGEgPSB0cmFpbmluZywgZmFtaWx5ID0gImJpbm9taWFsIikNCnN1bW1hcnkobXlsb2dpdCkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij48L2Rpdj4NCjEuIENhZGEgY2FtYmlvIGVuIHVuYSB1bmlkYWQgZW4gZWwgcGFnbyBob3NwaXRhbGFyaW8gZGlzbWludWlyw6EgbGFzIHByb2JhYmlsaWRhZGVzIGRlIHJlaG9zcGl0YWxpemFjacOzbiwgcGVybyBlbiB1bmEgY2FudGlkYWQgbXV5IHBlcXVlw7FhICgtNi45NTNFLTA4KQ0KMi4gQ3VhbmRvIGEgdW4gcGFjaWVudGUgc2UgbGUgcmVhbGl6w7MgdW4gcHJvY2VkaW1pZW50byBxdWlyw7pyZ2ljbyBzdSBwcm9iYWJpbGlkYWQgZGUgcXVlIHRlcm1pbmUgaG9zcGl0YWxpemFkbyBkZSBudWV2byBwb3IgZWwgbWlzbW8gZGlhZ27Ds3N0aWNvLCBkaXNtaW51eWUgZW4gbcOhcyBkZWwgMTklIGVuIGNvbXBhcmFjacOzbiBhIGN1YW5kbyBubyBzZSBsZSByZWFsaXphIG5pbmd1bmEgY2lydWfDrWEuDQoNCkVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMgbm8gc29uIHN1ZmljaWVudGVtZW50ZSBleHBsaWNhdGl2YXMgcGFyYSBwcmVkZWNpciwgZGUgbWFuZXJhIHNpZ25pZmljYXRpdmEsIHN1IGVmZWN0byBzb2JyZSBsYSB2YXJpYWJsZSBkZSByZXNwdWVzdGEgYmluYXJpYS4NCg0KRGVzcHXDqXMgZGUgZXN0aW1hZG9zIGxvcyBjb2VmaWNlbnRlcyBzZSBwcm9jZWRlIGEgcmVhbGl6YXIgbGEgcHJlZGljY2nDs24gZGVudHJvIHkgZnVlcmEgZGUgbXVlc3RyYSBwYXJhIGV2YWx1YXIgbGEgcHJlY2lzacOzbiAoYWNjdXJhY3kpIHkgY2FwYWNpZGFkIGRlIGdlbmVyYWxpemFjacOzbiBkZSBudWVzdHJvIG1vZGVsby4gPC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnByZWRfdHJhaW4gPC0gcHJlZGljdChteWxvZ2l0LCBuZXdkYXRhID0gdHJhaW5pbmdbLTddLCB0eXBlID0gInJlc3BvbnNlIikNCnlfcHJlZF90cmFpbiA8LSBpZmVsc2UocHJlZF90cmFpbiA+IDAuNSwgMSwgMCkNCnlfYWN0X3RyYWluIDwtIHRyYWluaW5nJHJlaG9zcF9vbXMNCg0KcHJlZCA9IHByZWRpY3QobXlsb2dpdCwgdHlwZSA9ICdyZXNwb25zZScsIG5ld2RhdGEgPSB0ZXN0aW5nWy03XSkNCnlfcHJlZCA9IGlmZWxzZShwcmVkID4gMC41LCAxLCAwKQ0KeV9hY3QgPC0gdGVzdGluZyRyZWhvc3Bfb21zDQoNCmthYmxlKGRhdGEuZnJhbWUoVHJhaW4gPSBtZWFuKHlfcHJlZF90cmFpbiA9PSB5X2FjdF90cmFpbiksIFRlc3QgPSBtZWFuKHlfcHJlZCA9PSB5X2FjdCkpKSAlPiUNCiAga2FibGVfc3R5bGluZyhwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgICByb3dfbGFiZWxfcG9zaXRpb24gPSAxLA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKSAlPiUNCnJvd19zcGVjKDAsYmFja2dyb3VuZD0iI0VCRjBGNyIpDQogIA0KYGBgDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij48L2Rpdj4NCkxvcyByZXN1bHRhZG9zIGluZGljYW4gdW4gbml2ZWwgZGUgYWNjdXJhY3kgZGUgNjIlIGVuIGxvcyBkYXRvcyBkZSBlbnRyZW5hbWllbnRvIHkgNjMlIGVuIHRlc3RpbmcuIFBhcmEgdmVyIGVuIGRldGFsbGUgY29tbyBzZSBjb21wb3J0YSwgYWwgZGlzY3JpbWluYXIgZW50cmUgbG9zIGNhc29zIGVuIHF1ZSBlbCBwYWNpZW50ZSBzYWxlIGRlZmluaXRpdmFtZW50ZSBvIHRlcm1pbmEgZW4gdW5hIHJlaG9zcGl0YWxpemFjacOzbiwgeSBldmlkZW5jaWFyIHN1IGRlc2VtcGXDsW8gcG9yIHNlcGFyYWRvLCBzZSBlc3RpbWFyw6EgbGEgbWF0cml6IGRlIGNvbmZ1c2nDs246PC9kaXY+DQoNCmBgYHtyfQ0KdGFibGUoYXMubWF0cml4KHRlc3RpbmdbLCA3XSksIHlfcHJlZCA+IDAuNSkNCmBgYA0KDQpMb3MgcmVzdWx0YWRvcyBubyBwYXJlY2VuIGluZGljYXIgcXVlIMOpc3RlIGNvbXBvcnRhbWllbnRvIHNlIGRlbiBhIGNhdXNhIGRlbCBkZXNiYWxhbmNlby4gUG9yIHVuIGxhZG8gdGVuZW1vcyBxdWUgbGEgc2Vuc2liaWxpZGFkIHkgbGEgZXNwZWNpZmljaWRhZCBjb3JyZXNwb25kZW4gYWwgOTYlIHkgOTklLiBTaSBzZSBoYWJsYSBlbiB0w6lybWlub3MgZGUgcHJlY2lzacOzbiwgc2Vyw61hIGRlIGRlIHVuIDk5JSBjdWFuZG8gZXMgMCwgZXMgZGVjaXIgZGUgdW4gdG90YWwgZGUgMTAyMTggcGFjaWVudGVzIHF1ZSBubyB0ZXJtaW5hcm9uIGVuIGhvc3BpdGFsaXphY2nDs24gcHVkZSBwcmVkZWNpciBjb24gdW5hIGV4YWN0aXR1ZCBxdWUgZWwgOTklIG5vIGxvIGhhcsOtYW4sIG1pZW50cmFzIHF1ZSBkZSAyNDkgcGFjaWVudGVzIHF1ZSBzaSB0dXZpZXJvbiB1bmEgcmVob3NwaXRhbGl6YWNpw7NuIHB1ZGUgcHJlZGVjaXIgcXVlIDIxMCBlZmVjdGl2YW1lbnRlIGxvIGhhcsOtYW4sIGVzIGRlY2lyLCBtaSBwcmVjaXNpw7NuIGZ1ZSBkZWwgODQlLiANCg0KU2luIGVtYmFyZ28sIG5vIHPDs2xvIHBvciBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MgY29uIGVsIGFqdXN0ZSBkZWwgbW9kZWxvLCBzaW5vIHRhbWJpw6luIGNvbiBsbyBxdWUgdmXDrWFtb3MgYW50ZXJpb3JtZW50ZSBlbiBsYSB0YWJsYSBkZWwgdmFsb3IgZGUgbGEgaW5mb3JtYWNpw7NuLCBsYXMgdmFyaWFibGVzIGTDrWFzIFVDSSB5IGTDrWFzIFVDRSBwYXJlY2VuIGV4cGxpY2FyIGRlIG1hbmVyYSBjYXNpIHBlcmZlY3RhIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgb2N1cnJlIHVuIGV2ZW50byByZWhvc3BpdGFsYXJpbyB5IGVzdG8gcHVlZGUgZGViZXJzZSAuLi4uLi4uLiBwb3IgZW5kZSBzZSBkZWNpZGUgZXN0aW1hciBlbCBtb2RlbG8gc2luIGluY2x1aXJsYXMuDQoNCkEgY29udGludWFjacOzbiwgc2Ugb2J0aWVuZW4gbG9zIHJlc3VsdGFkb3M6DQoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KbGlicmFyeShST0NSKQ0KUk9DUnByZWQgPSBwcmVkaWN0aW9uKHByZWQsIHRlc3RpbmckcmVob3NwX29tcykNCiANCiMgUGVyZm9ybWFuY2UgZnVuY3Rpb24NClJPQ1JwZXJmID0gcGVyZm9ybWFuY2UoUk9DUnByZWQsICJ0cHIiLCAiZnByIikNCg0KcGVyZjEgPC0gcGVyZm9ybWFuY2UoUk9DUnByZWQsICJwcmVjIiwgInJlYyIpDQpwbG90KHBlcmYxKQ0KIA0KIyBQbG90IFJPQyBjdXJ2ZQ0KcGxvdChST0NScGVyZiwgY29sb3JpemU9VFJVRSwgcHJpbnQuY3V0b2Zmcy5hdD1zZXEoMCwxLGJ5PTAuMSksIHRleHQuYWRqPWMoLTAuMiwxLjcpKQ0KDQpgYGANCg0KIyMjUmVndWxhcml6YWRvDQoNCnBhcmEgbGEgcmVndWxhcml6YWNpw7NuIHNlIHV0aWxpemFyw6EgZWwgcGFxdWV0ZSBnbG1uZXQsIGVsIGN1YWwgYXNpZ25hIHVuIHZhbG9yIGRlIGFscGhhID0gMCBpIGVzIHJpZGdlIHkgYWxwaGEgPSAxIHNpIGxhc3NvLiBBbnRlcyBkZSBzdW1lcmdpcnNlIGVuIGVsIGPDs2RpZ28sIHZhbGUgbGEgcGVuYSBzZcOxYWxhciBsbyBzaWd1aWVudGU6DQoNCiogZ2xtbmV0IG5vIHRpZW5lIHVuYSBpbnRlcmZheiBkZSBmw7NybXVsYSwgcG9yIGxvIHF1ZSB1bm8gdGllbmUgcXVlIGluZ3Jlc2FyIGxvcyBwcmVkaWN0b3JlcyBjb21vIHVuYSBtYXRyaXogeSBsYXMgZXRpcXVldGFzIGRlIGNsYXNlIGNvbW8gdW4gdmVjdG9yLg0KDQoqIG5vIGFjZXB0YSBwcmVkaWN0b3JlcyBjYXRlZ8Ozcmljb3MsIHBvciBsbyBxdWUgdW5vIHRpZW5lIHF1ZSBjb252ZXJ0aXJsb3MgZW4gdmFsb3JlcyBudW3DqXJpY29zIGFudGVzIGRlIHBhc2FybG9zIGEgZ2xtbmV0Lg0KDQpMYSBmdW5jacOzbiBnbG1uZXQgbW9kZWwubWF0cml4IGNyZWEgbGEgbWF0cml6IHkgdGFtYmnDqW4gY29udmllcnRlIGxvcyBwcmVkaWN0b3JlcyBjYXRlZ8Ozcmljb3MgZW4gdmFyaWFibGVzIGZpY3RpY2lhcyBhcHJvcGlhZGFzOyBtaWVudHJhcyBxdWUgc2UgdXNhcsOhIGxhIGZ1bmNpw7NuIGN2LmdsbW5ldCAsIHBhcmEgZW5jb250cmEgZGUgbWFuZXJhIGF1dG9tw6F0aWNhdW5hIGVsIHZhbG9yIMOzcHRpbW8gZGUgbGFtYmRhLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2xtbmV0KQ0KbGlicmFyeShNYXRyaXgpDQpzZXQuc2VlZCgxMjMpIA0KDQp4X3RyYWluIDwtIG1vZGVsLm1hdHJpeChyZWhvc3Bfb21zfi4sIHRyYWluaW5nKVssLTFdDQp5X3RyYWluIDwtIGlmZWxzZSh0cmFpbmluZyRyZWhvc3Bfb21zID09ICIxIiwgMSwgMCkNCg0KIyNIYWxsYW5kbyBlbCBtZWpvciBsYW1iZGENCmN2Lmxhc3NvIDwtIGN2LmdsbW5ldCh4X3RyYWluLCB5X3RyYWluLCBmYW1pbHkgPSAiYmlub21pYWwiLCB0eXBlLm1lYXN1cmUgPSAibXNlIiwgYWxwaGEgPSAxKQ0KcGxvdChjdi5sYXNzbykNCmBgYA0KDQpMYSBncsOhZmljYSBtdWVzdHJhIHF1ZSBlbCByZWdpc3RybyBkZWwgdmFsb3Igw7NwdGltbyBkZSBsYW1iZGEgKGVzIGRlY2lyLCBlbCBxdWUgbWluaW1pemEgZWwgZXJyb3IgY3VhZHLDoXRpY28gbWVkaW8pIGVzIGFwcm94aW1hZGFtZW50ZSAtMy4gRWwgdmFsb3IgZXhhY3RvIHNlIHB1ZWRlIHZlciBhbCBleGFtaW5hciBsYSB2YXJpYWJsZSBsYW1iZGFfbWluIGVuIGVsIGPDs2RpZ28gYSBjb250aW51YWNpw7NuLiBFbiBnZW5lcmFsLCBzaW4gZW1iYXJnbywgZWwgb2JqZXRpdm8gZGUgbGEgcmVndWxhcml6YWNpw7NuIGVzIGVxdWlsaWJyYXIgbGEgcHJlY2lzacOzbiB5IGxhIHNpbXBsaWNpZGFkLiBFbiBlbCBjb250ZXh0byBhY3R1YWwsIGVzdG8gc2lnbmlmaWNhIHVuIG1vZGVsbyBjb24gZWwgbWVub3IgbsO6bWVybyBkZSBjb2VmaWNpZW50ZXMgcXVlIHRhbWJpw6luIHByb3BvcmNpb25hIHVuYSBidWVuYSBwcmVjaXNpw7NuIC4gDQoNCmBgYHtyfQ0KY3YubGFzc28kbGFtYmRhLm1pbg0KYGBgDQoNCkVuIGdlbmVyYWwsIGVsIHByb3DDs3NpdG8gZGUgbGEgcmVndWxhcml6YWNpw7NuIGVzIGVxdWlsaWJyYXIgbGEgcHJlY2lzacOzbiB5IGxhIHNpbXBsaWNpZGFkLiBFc3RvIHNpZ25pZmljYSwgdW4gbW9kZWxvIGNvbiBlbCBtZW5vciBuw7ptZXJvIGRlIHByZWRpY3RvcmVzIHF1ZSB0YW1iacOpbiBkYSB1bmEgYnVlbmEgcHJlY2lzacOzbi4gUGFyYSBlc3RlIGZpbiwgbGEgZnVuY2nDs24gY3YuZ2xtbmV0KCkgdGFtYmnDqW4gZW5jdWVudHJhIGVsIHZhbG9yIGRlIGxhbWJkYSBxdWUgcHJvcG9yY2lvbmEgZWwgbW9kZWxvIG3DoXMgc2ltcGxlIHBlcm8gdGFtYmnDqW4gc2UgZW5jdWVudHJhIGRlbnRybyBkZSB1biBlcnJvciBlc3TDoW5kYXIgZGVsIHZhbG9yIMOzcHRpbW8gZGUgbGFtYmRhLiBFc3RlIHZhbG9yIHNlIGxsYW1hIGxhbWJkYS4xc2UuIEVzdGUgdmFsb3IgZGUgbGFtYmRhICggbGFtYmRhLjFzZSkgZXMgbG8gcXVlIHVzYXJlbW9zIGVuIGVsIHJlc3RvIGRlIGxhIGNvbXB1dGFjacOzbi4NCg0KDQpgYGB7cn0NCmN2Lmxhc3NvJGxhbWJkYS4xc2UNCmBgYA0KDQpgYGB7cn0NCmNvZWYoY3YubGFzc28sIGN2Lmxhc3NvJGxhbWJkYS5taW4pDQpgYGANCg0KTGEgc2FsaWRhIG11ZXN0cmEgcXVlIHNvbG8gYXF1ZWxsYXMgdmFyaWFibGVzIHF1ZSBoZW1vcyBkZXRlcm1pbmFkbyBxdWUgc29uIHNpZ25pZmljYXRpdmFzIGVuIGJhc2UgYSBsb3MgdmFsb3JlcyBkZSBwIHRpZW5lbiBjb2VmaWNpZW50ZXMgZGlzdGludG9zIGRlIGNlcm8sIGVuIGVzdGUgY2FzbyBlbCBwYWdvIGhvc3BpdGFsYXJpbywgdG9kb3MgbG9zIGNvZWZpY2llbnRlcyBkZSBsYXMgZGVtw6FzIHZhcmlhYmxlcyBoYW4gc2lkbyBwdWVzdG9zIGEgY2VybyBwb3IgZWwgYWxnb3JpdG1vLg0KDQpVc2FuZG8gbGFtYmRhLjFzZWNvbW8gbGEgbWVqb3IgbGFtYmRhLCBkYSBsb3Mgc2lndWllbnRlcyBjb2VmaWNpZW50ZXMgZGUgcmVncmVzacOzbjoNCg0KYGBge3J9DQpjb2VmKGN2Lmxhc3NvLCBjdi5sYXNzbyRsYW1iZGEuMXNlKQ0KYGBgDQoNClVzYW5kbyBsYW1iZGEuMXNlLCBsb3MgY29lZmljaWVudGUgZGUgNCB2YXJpYWJsZXMgc2UgaGFuIGVzdGFibGVjaWRvIGVuIGNlcm8gbWVkaWFudGUgZWwgYWxnb3JpdG1vIGRlIGxhem8sIHJlZHVjaWVuZG8gbGEgY29tcGxlamlkYWQgZGVsIG1vZGVsby4NCg0KTGEgY29uZmlndXJhY2nDs24gZGUgbGFtYmRhID0gbGFtYmRhLjFzZSBwcm9kdWNlIHVuIG1vZGVsbyBtw6FzIHNpbXBsZSBlbiBjb21wYXJhY2nDs24gY29uIGxhbWJkYS5taW4sIHBlcm8gZWwgbW9kZWxvIHBvZHLDrWEgc2VyIHVuIHBvY28gbWVub3MgcHJlY2lzbyBxdWUgZWwgb2J0ZW5pZG8gY29uIGxhbWJkYS5taW4uDQoNCmBgYHtyfQ0KIyNMYW1iZGEgcmVncmVzc2lvbg0Kc3RkX3JpZGdlX2xvZ2l0IDwtIGdsbW5ldCh4X3RyYWluLCB5X3RyYWluLCBmYW1pbHk9ImJpbm9taWFsIiwgYWxwaGE9MSkNClNSTF9wcmVkX3RyYWluIDwtIHByZWRpY3Qoc3RkX3JpZGdlX2xvZ2l0LCB4X3RyYWluLCB0eXBlPSJjbGFzcyIsIHM9Y3YubGFzc28kbGFtYmRhLjFzZSkNCg0KYGBgDQoNCiMjI01hdHJpeiB0cmFpbmluZw0KYGBge3J9DQpjb25mdXNpb25fbWF0cml4X3RyYWluIDwtIHRhYmxlKHlfdHJhaW4sIFNSTF9wcmVkX3RyYWluKQ0KY29uZnVzaW9uX21hdHJpeF90cmFpbg0KYGBgDQoNCmBgYHtyfQ0KZXJyb3JfcmF0ZV90cmFpbiA8LSAoNzYwKzkyMCkvKDc2MCs5MjArMTgxNCsxMzY4KQ0KZXJyb3JfcmF0ZV90cmFpbg0KYGBgDQoNCiMjI01hdHJpeiB0ZXN0DQpgYGB7cn0NCg0KeF90ZXN0IDwtIG1vZGVsLm1hdHJpeChyZWhvc3Bfb21zfi4sIHRlc3RpbmcpWywtMV0NCnlfdGVzdCA8LSBpZmVsc2UodGVzdGluZyRyZWhvc3Bfb21zID09IDEsIDEsIDApDQoNCg0KYGBgDQoNCmBgYHtyfQ0KU1JMX3ByZWRfdGVzdCA8LSBwcmVkaWN0KHN0ZF9yaWRnZV9sb2dpdCwgeF90ZXN0LCB0eXBlPSJjbGFzcyIsIHM9Y3YubGFzc28kbGFtYmRhLjFzZSkNCmNvbmZ1c2lvbl9tYXRyaXhfdGVzdCA8LSB0YWJsZSh5X3Rlc3QsIFNSTF9wcmVkX3Rlc3QpDQpjb25mdXNpb25fbWF0cml4X3Rlc3QNCmBgYA0KDQpgYGB7cn0NCmVycm9yX3JhdGVfdGVzdCA8LSAoODQrMjg2NykvKDczNDQrMjg2Nys4NCsxMjkpDQplcnJvcl9yYXRlX3Rlc3QNCmBgYA0KDQpDYWxjdWxhbmRvIGVsIG1vZGVsbyBjb24gcmlkZ2U6DQpgYGB7cn0NCiMjSGFsbGFuZG8gZWwgbWVqb3IgbGFtYmRhDQpjdi5yaWRnZSA8LSBjdi5nbG1uZXQoeF90cmFpbiwgeV90cmFpbiwgZmFtaWx5ID0gImJpbm9taWFsIiwgdHlwZS5tZWFzdXJlID0gIm1zZSIsIGFscGhhID0gMCkNCmNvZWYoY3YucmlkZ2UsIGN2LnJpZGdlJGxhbWJkYS4xc2UpDQpgYGANCg0KYGBge3J9DQpTUlJfcHJlZF90ZXN0IDwtIHByZWRpY3Qoc3RkX3JpZGdlX2xvZ2l0LCB4X3Rlc3QsIHR5cGU9ImNsYXNzIiwgcz1jdi5yaWRnZSRsYW1iZGEuMXNlKQ0KY29uZnVzaW9uX21hdHJpeF90ZXN0IDwtIHRhYmxlKHlfdGVzdCwgU1JSX3ByZWRfdGVzdCkNCmNvbmZ1c2lvbl9tYXRyaXhfdGVzdA0KYGBgDQoNCg0KW1ZvbHZlciBhbCDDjW5kaWNlXSgjaW5kaWNlKTwvZGl2Pg0KDQo8aHI+DQo8aDMgaWQ9IlJlY29tZW5kYWNpb24iIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBtYXJrZG93bj0iMSI+UmVjb21lbmRhY2lvbmVzIHkgRXN0cmF0ZWdpYXM8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkNvbW8gc2UgcHVkbyBvYnNlcnZhciBlbiBsYSBkZWZpbmljaW9uIGRlIGxhIHZhcmlhYmxlIGVuZMOzZ2VuYSBkZSBsYSByZWhvc3BpdGFsaXphY2nDs24sIGVzdGEgc2UgY29uc3RydXnDsyBtZWRpYW50ZSBkb3MgcmVzdHJpY2Npb25lcyBlbiBlbCBzZXQgZGUgZGF0b3MgaW5pY2lhbDoNCjEuIFF1ZSBkZW50cm8gZGUgbG9zIHNpZ3VpZW50ZXMgMzAgZGlhcyBhIGxhIHByaW1lcmEgaG9zcGl0YWxpemFjacOzbiBzdXJnaWVyYSB1bmEgc2VndW5kYSBob3NwaXRhbGl6YWNpb24uDQoyLiBRdWUgcGFyYSBhcXVlbGxvcyBjYXNvcyBkb25kZSBoYXkgZG9zIGV2ZW50b3MgZW4gbGEgdmVudGFuYSBkZSAzMCBkw61hcywgbG9zIGPDs2RpZ29zIGRlIGRpYWduw7NzdGljbyBDSUUxMCBkZWwgcHJpbWVybyB5IHNlZ3VuZG8gZXZlbnRvIHBlcnRlbmVjaWVyYW4gYSBsYSBtaXNtYSBjYXRlZ29yw61hIGRlIGRpYWfDs3N0aWNvIGVuIGxhIGNsYXNpZmljYWNpw7NuIGRlIGxhIE9NUy4NCg0KRW4gZXN0ZSBzZW50aWRvLCB0ZW5lbW9zIGRvcyBjb25kaWNpb25hbnRlcyBxdWUgc2UgcG9kcsOtYW4gYWp1c3RhciwgeWEgcXVlIHJlc3RyaW5nZW4gbGEgcG9zaWJpbGlkYWQgZGUgZW5jb250cmFyIHVuIG1heW9yIG51bWVybyBkZSBjYXNvcyBxdWUgc2UgcHVlZGFuIGNvbnNpZGVyYXIgY29tbyByZWhvc3BpdGFsaXphY2nDs247IHBvciBlamVtcGxvLCBhbGd1bm9zIGVzdHVkaW9zIHN1Z2llcmVuIHF1ZSBsYSB2ZW50YW5hIGRlIHRpZW1wbyBwb2Ryw61hIHNlciBkZSAxNSBkaWFzIGVudHJlIGVsIHByaW1lciB5IHNlZ3VuZG8gZXZlbnRvLiBFbiBjdWFudG8gYSBsYSBzaW1pbGl0dWQgZGUgbG9zIGRpYWduw7NzdGljb3MgZGUgYW1ib3MgZXZlbnRvcywgcGFyYSBlc3RlIG1vZGVsbyBzZSB0dXZvIGVuIGN1ZW50YSBzb2xvIHNpIGFtYm9zIGRpYWduw7NzdGljb3MgcGVydGVuZWNlbiBhIGxhIG1pc21hIGNhdGVnb3LDrWEsIHNpbiBlbWJhcmdvIGVzIGltcG9ydGFudGUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBoYXkgZGlhZ27Ds3N0aWNvcyBxdWUgcHVlZGVuIGRlc2VuY2FkZW5hciBlbiBvdHJvcyBxdWUgbm8gbmVjZXNhcmlhbWVudGUgc2VhbiBkZSBsYSBtaXNtYSBjYXRlZ29yw61hLiBFc3RlIHRpcG8gZGUgYXNvY2lhY2lvbmVzIHJlcXVpZXJlbiBkZSB1biBtYXlvciBhbsOhbGlzaXMgYSBuaXZlbCBtw6lkaWNvLg0KDQpTZSBoYW4gZGVzY3JpdG8gZmFjdG9yZXMgYXNvY2lhZG9zIGNvbiBsYSByZWhvc3BpdGFsaXphY2lvbiByZWxhY2lvbmFkb3MgY29uIGxhIGNhbGlkYWQgZGUgdmlkYSBkZSBsb3MgcGFjaWVudGVzLCBzaW4gZW1iYXJnbyBlbiBlc3RlIG1vZGVsbyBubyBzZSBpbmNsdXlvIGdyYW4gcGFydGUgZGUgZXN0ZSB0aXBvIGRlIGluZm9ybWFjaW9uLCB5YSBxdWUsIGRlc2RlIGVsIHByaW5jaXBpbywgbGEgcG9ibGFjacOzbiBvYmpldGl2byBzZSBjb21wb25lIGRlIGluZGl2aWR1b3MgYXNlZ3VyYWRvcyBlbiBwb2xpemEgZGUgdmlkYSB5IHNhbHVkLCBlbiBzdSBtYXlvcmlhLCBkZSBlc3RyYXRvIGN1YXRybyBoYWNpYSBhcnJpYmEuIERlIGVzdGEgZm9ybWEgeWEgbm8gYXBvcnRhIGluZm9ybWFjacOzbiBtZWRpciBlbCBuaXZlbCBkZSBjYWxpZGFkIGRlIHZpZGEgbyBmYWxpY2lkYWQgZGUgYWNjZXNvIGEgbG9zIHNlcnZpY2lvcyBkZSBzYWx1ZCwgcGVybyBzZSBwb2RyaWEgdGVuZXIgZW4gY3VlbnRhIGluZm9ybWFjacOzbiByZWxhY2lvbmFkYSBjb24gc2ludG9tYXMgZGVwcmVzaXZvcy4NCg0KTGEgY2FsaWRhZCBlbiBlbCBjdWlkYWRvIGhvc3BpdGFsYXJpbyB0YW1iaWVuIHNlIGhhIGNvbnNpZGVyYWRvIGNvbW8gdW4gZmFjdG9yIGltcG9ydGFudGUsIHBvciBsbyB0YW50byBzZSBwb2Ryw61hIGNvbnNpZGVyYXIgbGEgYWdyZWdhY2nDs24gZGUgIGluZm9ybWFjacOzbiBxdWUgaW5kaXF1ZSBxdWUgdGFuIMOzcHRpbWFzIHNvbiBsYXMgY29uZGljaW9uZXMgcGFyYSB1bmEgYnVlbmEgYXRlbmNpw7NuIGVuIGxvcyBjZW50cm9zIGhvc3BpdGFsYXJpb3MgeSBsdWdhcmVzIHF1ZSBzZSB0dXZpZXJvbiBlbiBjdWVudGEuPC9kaXY+DQoNCg==
=======
# PASO 1: Carga Package y Set de datos
# ---------------------------------------------------------------------------
library(C50)
library(rpart)
library(rpart.plot)
data(churn); # carga tablas
# PASO 2: Crea Arbol de Decision
# ---------------------------------------------------------------------------
ModeloArbol <- rpart(rehosp_oms ~ ., data = training, parms=list(split="information"))
# PASO 3: Predice rehospitalizacion en datos de TEST
# ---------------------------------------------------------------------------
Prediccion <- predict(ModeloArbol, testing, type="class") # Predicción en Test
MC <- table(testing$rehosp_oms, Prediccion) # Matriz de Confusión
MC
Prediccion
0 1
0 8361 1850
1 108 105
# PASO 4: Crea Grafico
# ---------------------------------------------------------------------------
rpart.plot(ModeloArbol, type=1, extra=100,cex = .7, box.col=c("gray99", "gray88")[ModeloArbol$frame$yval])

library(e1071)
# Ejecución del modelo SVM
modelosvm <- svm(rehosp_oms ~ ., data = training)
# Predicción de los restantes
prediccionsvm <- predict(modelosvm, new = testing)
# Tabla de confusión.
# Se usa with para que aparezca el nombre de la variable Species en ella
# ya que en caso contrario no sale.
(mc <- with(testing,(table(prediccionsvm, rehosp_oms))))
rehosp_oms
prediccionsvm 0 1
0 6770 71
1 3441 142
# % correctamente clasificados
(correctos <- sum(diag(mc)) / nrow(testing) *100)
[1] 66.30852
library(ipred)
# Ejecución del modelo de Bagging
modelobag <- bagging(rehosp_oms~., data=training)
# Resumen del ajuste del modelo
#modelo
##
## Bagging classification trees with 25 bootstrap replications
##
## Call: bagging.data.frame(formula = Species ~ ., data = datos.entreno)
# Hacer predicciones
prediccionbag <- predict(modelobag, testing)
# Matriz de confusión
(mc <- with(testing,table(prediccionbag, rehosp_oms)))
rehosp_oms
prediccionbag 0 1
0 7979 115
1 2232 98
# Carga el paquete específico del método Random Forest
library(randomForest)
# Ajustar modelo
modeloRForest <- randomForest(rehosp_oms~., data=training)
# Resumen del ajuste del modelo
#modelo
prediccionRForest <- predict(modeloRForest, testing)
# Matriz de confusión
(mc <- with(testing, table(prediccionRForest, rehosp_oms)))
rehosp_oms
prediccionRForest 0 1
0 8262 110
1 1949 103
LS0tDQp0aXRsZTogIjxzcGFuIHN0eWxlPSdjb2xvcjojMzA1ZjcyJz48Y2VudGVyPjxicj5Nb2RlbG8gZGUgUHJlZGljY2nDs24gUmVob3NwaXRhbGl6YWNpw7NuPC9jZW50ZXI+Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpkYXRlOiAiPGNlbnRlcj5BYnJpbCAyMDE5PC9jZW50ZXI+Ig0KYXV0aG9yOiAiPGNlbnRlcj48YSBocmVmPSdtYWlsdG86YW5kcmVzLmdvbnphbGV6QGRhdGFseXRpY3MuY29tJz5BbmRyw6lzIEZlbGlwZSBHb256w6FsZXo8L2E+PC9jZW50ZXI+Ig0KLS0tDQoNCjxocj4NCjx0YWJsZT4NCjx0cj4NCjx0ZD48aW1nIHN0eWxlPSJ3aWR0aDoyODBweDsgaGVpZ2h0OjIwMHB4OyIgc3JjPSJTVVJBLnBuZyIgLz48L3RkPg0KPHRkPjxpbWcgc3R5bGU9IndpZHRoOjIwMHB4OyBoZWlnaHQ6MTUwcHg7IiBzcmM9ImJsYW5jby5qcGciIC8+PC90ZD4NCjx0ZD48aW1nIHN0eWxlPSJ3aWR0aDozNjBweDsgaGVpZ2h0OjEwMHB4OyIgc3JjPSJEYXRhbHl0aWNzLnBuZyIgLz48L3RkPg0KPC90cj4NCjwvdGFibGU+DQo8aHI+DQoNCjxoMyBpZD0iaW5kaWNlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPsONbmRpY2U8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIHByZXNlbnRlIG5vdGVib29rIGNvbnRpZW5lIGluZm9ybWFjacOzbiByZWxhY2lvbmFkYSBhbCBlbnRlbmRpbWllbnRvIGRlIGxvcyBkYXRvcyB5IHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGRlIHVuIG1vZGVsbyBkZSBwcmVkaWNjacOzbiBwYXJhIGVsIHByb2JsZW1hIGRlIHJlaG9zcGl0YWxpemFjacOzbi4NCg0KPG9sPg0KICAgIDxsaT48YSBocmVmPSIjR2VuZXJhbGlkYWRlcyI+R2VuZXJhbGlkYWRlczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjRW50ZW5kaW1pZW50byI+RW50ZW5kaW1pZW50byBkZSBsb3MgZGF0b3M8L2E+PC9saT4NCiAgICA8bGk+PGEgaHJlZj0iI1BlcmRpZG9zIj5BbsOhbGlzaXMgZGUgUmVnaXN0cm9zIFDDqXJkaWRvczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjQW5hbGlzaXMiPkFuw6FsaXNpcyBFeHBsb3JhdG9yaW88L2E+PC9saT4NCiAgICAgIDxvbD4NCiAgICAgICAgPGxpPjxhIGhyZWY9IiNBbmFsaXNpc0NvbiI+QW7DoWxpc2lzIHVuaXZhcmlhZG8gLSB2YXJpYWJsZXMgY29udGludWFzPC9hPjwvbGk+DQogICAgICAgIDxsaT48YSBocmVmPSIjQW5hbGlzaXNDYXIiPkFuw6FsaXNpcyB1bml2YXJpYWRvIC0gdmFyaWFibGVzIGNhcmRpbmFsZXM8L2E+PC9saT4NCiAgICAgIDwvb2w+DQogICAgPGxpPjxhIGhyZWY9IiNBbmFsaXNpc1dPRSI+QW7DoWxpc2lzIGRlIGNsYXNpZmljYWNpw7NuIGJpbmFyaWEgdXNhbmRvIFdPRSB5IGVsIElWPC9hPjwvbGk+DQogICAgPGxpPjxhIGhyZWY9IiNNb2RlbG8iPk1vZGVsbzwvYT48L2xpPg0KICAgICAgPG9sPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI1NNT1RFIj5TTU9URSAtIEJhbGFuY2VvIGRlIGNhdGVnb3JpYSBtaW5vcml0YXJpYTwvYT48L2xpPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI0FqdXN0ZW1vZCI+QWp1c3RlIGRlbCBtb2RlbG8geSBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvczwvYT48L2xpPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI0V2YWx1YWNpb24iPlByZWRpY2llbmRvIHkgZXZhbHVhbmRvIGVsIGRlc2VtcGXDsW8gZGVsIG1vZGVsbzwvYT48L2xpPg0KICAgICAgPC9vbD4NCiAgICA8bGk+PGEgaHJlZj0iI0NvbmNsdXNpb25lcyI+UmVzdWx0YWRvcyB5IENvbmNsdXNpb25lczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjUmVjb21lbmRhY2lvbiI+UmVjb21lbmRhY2lvbmVzIHkgRXN0cmF0ZWdpYXM8L2E+PC9saT4NCjwvb2w+DQoNCkhhY2llbmRvIGNsaWNrIHNvYnJlIGNhZGEgdW5hIGRlIGxhcyBzZWNjaW9uZXMgcHVlZGUgaXIgZGlyZWN0YW1lbnRlIGEgY2FkYSB1bmEgZGUgZWxsYXMuIEFsIGZpbmFsaXphciBjYWRhIHNlY2Npw7NuIGVuY29udHJhcsOhIHVuIGxpbmsgcGFyYSB2b2x2ZXIgYWwgw61uZGljZS48L2Rpdj4NCjxocj4NCg0KPGgzIGlkPSJHZW5lcmFsaWRhZGVzIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPkdlbmVyYWxpZGFkZXM8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIG9iamV0aXZvIGVzIGRlc2Fycm9sbGFyIGUgaW1wbGVtZW50YXIgdW4gbW9kZWxvIGRlIHByZWRpY2Npw7NuIGRlIHJlaG9zcGl0YWxpemFjaW9uZXMgcGFyYSBhcG95YXIgbG9zIHByb2dyYW1hcyBkZSBldml0YWJpbGlkYWQgcG9zdC1ob3NwaXRhbGFyaWEuIEVsIGFuw6FsaXNpcyBzZSByZWFsaXphcsOhIGNvbiBpbmZvcm1hY2nDs24gcXVlIGRlc2NyaWJlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIHNvY2lvZGVtb2dyw6FmaWNhcyBkZWwgaW5kaXZpZHVvIHkgY29uIGFsZ3Vub3MgZGF0b3MgcmVjb2xlY3RhZG9zIHBvciBlbCBwZXJzb25hbCBob3NwaXRhbGFyaW87IHBhcmEgdW4gcGVyaW9kbyBkZSB0aWVtcG8gZGUgZG9zIGHDsW9zIHkgbWVkaW8sIHF1ZSB2YSBkZXNkZSAyMDE2IGhhc3RhIDIwMTguDQoNClBhcmEgZWwgYW7DoWxpc2lzIHJlYWxpemFkbyBzZSBjb25zaWRlcsOzIHF1ZSB1bmEgcmVob3NwaXRhbGl6YWNpw7NuIHN1cmdlIGFsIGN1bXBsaXJzZSBsYXMgc2lndWllbnRlcyBjb25kaWNpb25lczoNCjEuIFF1ZSAzMCBkaWFzIHBvc3RlcmlvcmVzIGEgdW5hIHByaW1lcmEgaG9zcGl0YWxpemFjacOzbiwgZWwgcGFjaWVudGUgZGFiZSByZWN1cnJpciBudWV2YW1lbnRlIGEgdW5hIGhvc3BpdGFsaXphY2nDs24uDQoyLiBRdWUgbG9zIGRpYWduw7NzdGljb3MgdGFudG8gZGUgbGEgcHJpbWVyYSBjb21vIGRlIGxhIHNlZ3VuZGEgaG9zcGl0YWxpemFjaXBvbiBjb2luY2lkYW4gZW4gbGEgY2F0ZWdvcmlhIGRpYWduw7NzdGljbyBkZSBsYSBPTVMuDQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpybShsaXN0ID0gbHMoKSkNCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQpzb3VyY2UoImZ1bmN0aW9uc19wbG90LlIiKQ0KDQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoInJlYWR4bCIsICJkcGx5ciIsICJnZ3Bsb3QyIiwgImdnY29ycnBsb3QiLCAiVklNIiwgIlJDb2xvckJyZXdlciIsICJJbmZvcm1hdGlvbiIsICJrbml0ciIsICJrYWJsZUV4dHJhIiwgImdyaWRFeHRyYSIsICJza2ltciIsICJub3J0ZXN0IiwgIkdHYWxseSIsICJwbG90bHkiLCAibGF0dGljZSIsICJETXdSIiwgImNhVG9vbHMiLCAicGxvdGx5IikNCg0KbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbIShsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQ0KDQpsb2FkIDwtIGxhcHBseShsaXN0Lm9mLnBhY2thZ2VzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQpgYGANCg0KPGhyPg0KPGgzIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBpZD0iRW50ZW5kaW1pZW50byIgbWFya2Rvd24gPSAiMSI+RW50ZW5kaW1pZW50byBkZSBsb3MgZGF0b3M8L2gzPg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+IA0KDQpFbCBhcmNoaXZvIGNvbnRpZW5lIHJlZ2lzdHJvcyBxdWUgY29ycmVzcG9uZGVuIGEgZXZlbnRvcyBkZSByZWhvc3BpdGFsaXphY2lvbmVzIHkgc2UgZW5jdWVudHJhIGRldGFsbGFkbyBhIG5pdmVsIGRlIGNhZGEgZXZlbnRvIGhvc3BpdGFsYXJpby4gRW4gdG90YWwgc29uIDM0ODk4IHJlZ2lzdHJvcywgMTggdmFyaWFibGVzLCBkZXNjYXJ0YW5kbyBkZSBtYW5lcmEgaW5pY2lhbCwgYXF1ZWxsb3MgYXRyaWJ1dG9zIHF1ZSBzZSBkZXJpdmFuIGRlc3B1w6lzIGRlbCBzZWd1bmRvIGRpYWduw7NzdGljbzsgbG9zIGRhdG9zIHNlIGRlc2NyaWJlbiBhIGNvbnRpbnVhY2nDs246PC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KZGF0YV9yZWhvc3AgPC0gcmVhZF94bHN4KCJEQVRBX1JFSE9TUC54bHN4IixuYSA9IGMoIm5hIiwgIk5BIiwgIm51bGwiLCAiTlVMTCIpKQ0KZGF0YV9yZWhvc3AgJT4lDQogIHNlbGVjdChFZGFkX0hvc3BpdGFsaXphY2lvbiwNCiAgICAgICAgIEVzdHJhdG9fVml2aWVuZGEsDQogICAgICAgICBSYW5nb19JbmdyZXNvc19EZXNjLA0KICAgICAgICAgRXN0YWRvX0NpdmlsLA0KICAgICAgICAgR2VuZXJvLA0KICAgICAgICAgY2FudGlkYWRfbWFyY2FzLA0KICAgICAgICAgUmFtb19JZCwNCiAgICAgICAgIENpdWRhZF9Db250YWN0b19Ob21icmUsDQogICAgICAgICBDb2RpZ29fRGlhZ25vc3RpY29fT3AsDQogICAgICAgICBDYXRlZ29yaWFfRHhfSWQsDQogICAgICAgICBRdWlydXJnaWNvLA0KICAgICAgICAgRmVjaGFfSW5ncmVzb19Ib3NwLA0KICAgICAgICAgTnVtZXJvX0RpYXNfSG9zcGl0YWxhcmlvLA0KICAgICAgICAgTnVtZXJvX0RpYXNfVWNpLA0KICAgICAgICAgTnVtZXJvX0RpYXNfVWNlLA0KICAgICAgICAgUHJvdmVlZG9yLA0KICAgICAgICAgVmFsb3JfUGFnYWRvX0RpYWdub3N0aWNvLA0KICAgICAgICAgcmVob3NwX2NhdF9vbXMpICU+JQ0KICByZW5hbWUoZWRhZCA9IEVkYWRfSG9zcGl0YWxpemFjaW9uLCANCiAgICAgICAgIGVzdHJhdG8gPSBFc3RyYXRvX1ZpdmllbmRhLA0KICAgICAgICAgaW5ncmVzbyA9IFJhbmdvX0luZ3Jlc29zX0Rlc2MsDQogICAgICAgICBlc3RfY2l2aWwgPSBFc3RhZG9fQ2l2aWwsDQogICAgICAgICBnZW5lcm8gPSBHZW5lcm8sDQogICAgICAgICBtYXJjYXMgPSBjYW50aWRhZF9tYXJjYXMsDQogICAgICAgICByYW1vID0gUmFtb19JZCwNCiAgICAgICAgIGNpdWRhZCA9IENpdWRhZF9Db250YWN0b19Ob21icmUsDQogICAgICAgICBkaWFnbm9zID0gQ29kaWdvX0RpYWdub3N0aWNvX09wLA0KICAgICAgICAgY2F0ZWdvcmlhID0gQ2F0ZWdvcmlhX0R4X0lkLA0KICAgICAgICAgcXVpcnVyID0gUXVpcnVyZ2ljbywNCiAgICAgICAgIGZlY2hhX2luZ3Jlc28gPSBGZWNoYV9JbmdyZXNvX0hvc3AsDQogICAgICAgICBkaWFzX2hvc3AgPSBOdW1lcm9fRGlhc19Ib3NwaXRhbGFyaW8sDQogICAgICAgICBkaWFzX3VjaSA9IE51bWVyb19EaWFzX1VjaSwNCiAgICAgICAgIGRpYXNfdWNlID0gTnVtZXJvX0RpYXNfVWNlLA0KICAgICAgICAgcHJvdmVlZG9yID0gUHJvdmVlZG9yLA0KICAgICAgICAgcGFnb19ob3NwID0gVmFsb3JfUGFnYWRvX0RpYWdub3N0aWNvLA0KICAgICAgICAgcmVob3NwX29tcyA9IHJlaG9zcF9jYXRfb21zKSAtPiBkYXRhX3JlaG9zcA0KaGVhZChkYXRhX3JlaG9zcCkNCmBgYA0KDQo8dWw+DQo8bGk+VmFyaWFibGVzIGNvbnRpbnVhcyAoNCkNCjx1bD4NCjxsaT5kaWFzX2hvc3A6IGTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs248L2xpPg0KPGxpPmRpYXNfdWNpOiBuw7ptZXJvIGTDrWFzIGVuIFVDSTwvbGk+DQo8bGk+ZGlhc191Y2U6IG7Dum1lcm8gZMOtYXMgZW4gVUNFPC9saT4NCjxsaT5wYWdvX2hvc3A6IHZhbG9yIHBhZ2FkbyBwcmltZXJhIGhvc3BpdGFsaXphY2nDs248L2xpPg0KPC91bD4NCjwvbGk+DQo8L3VsPg0KPHVsPg0KPGxpPlZhcmlhYmxlcyBub21pbmFsZXMgKDUpDQo8dWw+DQo8bGk+ZXN0cmF0bzogZXN0cmF0byBWaXZpZW5kYSAoMCwxLDIsMyw0LDUsNiwtMSk8L2xpPg0KPGxpPmVzdF9jaXZpbDogZXN0YWRvIGNpdmlsIChDLEQsUyxVLFYsLTEpPC9saT4NCjxsaT5jaXVkYWQ6IGNpdWRhZCBkZSBjb250YWN0byBkZWwgYXNlZ3VyYWRvPC9saT4NCjxsaT5kaWFnbm9zOiBjw7NkaWdvIGRpYWduw7NzdGljbyBDSUUxMCBkZSBsYSBwcmltZXJhIGF0ZW5jacOzbiA8L2xpPg0KPGxpPmNhdGVnb3JpYTogY2F0ZWdvcsOtYSBkZWwgZGlhZ27Ds3N0aWNvIHNlZ8O6biBlbCB0aXBvIGRlIGVuZmVybWVkYWQ8L2xpPg0KPC91bD4NCjwvbGk+DQo8L3VsPg0KPHVsPg0KPGxpPlZhcmlhYmxlIGRpY290w7NtaWNhICg0KQ0KPHVsPg0KPGxpPmdlbmVybzogZ8OpbmVybyBkZWwgYXNlZ3VyYWRvIChNLEYpPC9saT4NCjxsaT5yYW1vOiByYW1vIGFsIHF1ZSBwZXJ0ZW5lY2UgZWwgYXNlZ3VyYWRvPC9saT4NCjxsaT5xdWlydXI6IHNpIHR1dm8gYWxndW4gdGlwbyBkZSBzZXJ2aWNpbyByZWxhY2lvbmFkbyBhIHByb2NlZGltaWVudG8gcXVpcsO6cmdpY288L2xpPg0KPGxpPnJlaG9zcF9jYXRfb21zOiBzaW1pbGl0dWQgY2F0ZWdvcsOtYSBjaWUxMC4gRXN0YSBlcyBudWVzdHJhIHZhcmlhYmxlIG9iamV0aXZvIDwvbGk+DQo8L3VsPg0KPC9saT4NCjwvdWw+DQo8dWw+DQo8bGk+VmFyaWFibGVzIGRpc2NyZXRhcyAoMikNCjx1bD4NCjxsaT5lZGFkOiBlZGFkIGRlbCBhc2VndXJhZG8gZW4gZWwgbW9tZW50byBkZSBsYSBob3NwaXRhbGl6YWNpw7NuPC9saT4NCjxsaT5tYXJjYXM6IGNhbnRpZGFkIGRlIG1hcmNhcyBjb25maXJtYWRhcyBkZWwgYXNlZ3VyYWRvPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCjx1bD4NCjxsaT5WYXJpYWJsZXMgb3JkaW5hbGVzICgxKQ0KPHVsPg0KPGxpPmluZ3Jlc286IHJhbmdvIGRlIGluZ3Jlc29zPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCjx1bD4NCjxsaT5GZWNoYSAoMSkNCjx1bD4NCjxsaT5GZWNoYV9JbmdyZXNvOiBmZWNoYSBpbmdyZXNvIGhvc3BpdGFsaXphY2nDs24gPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+DQpHZW5lcmFtb3MgbGEgZXN0YWTDrXN0aWNhIGRlc2NyaXB0aXZhOyBlbiBlbGxhIHNlIHB1ZWRlIHZpc3VhbGl6YXIgcXVlIHNlcsOhIG5lY2VzYXJpbyByZWFsaXphciBtw6FzIGFkZWxhbnRlIGFsZ3VuYXMgY29udmVyc2lvbmVzIGVuIGxvcyB0aXBvcyBkZSBkYXRvcyBxdWUgdmllbmVuIHBvciBkZWZlY3RvIChwb3IgZWplbXBsbyBlbCBlc3RyYXRvIGFwYXJlY2UgY29tbyB1bmEgdmFyaWFibGUgbnVtw6lyaWNhKS4gUGVybyBhbnRlcyBkZSBjb250aW51YXIgY29uIGxhIGNvZGlmaWNhY2nDs24sIHByb2NlZGVyZW1vcyBhIG9ic2VydmFyIGNvbW8gc2UgZW5jdWVudHJhbiBudWVzdHJhcyB2YXJpYWJsZXMuPC9kaXY+DQoNCjxicj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpza2ltX3dpdGgobnVtZXJpYyA9IGxpc3QoaGlzdCA9IE5VTEwpKQ0KDQpkYXRhX3JlaG9zcCAlPiUgDQogIGdyb3VwX2J5KCkgJT4lDQogIHNraW0oKQ0KYGBgDQoNCjx1bD4NCjxsaT5MYSB2YXJpYWJsZSBpbmdyZXNvIGVzIGxhIHF1ZSBtw6FzIGRhdG9zIHBlcmRpZG9zIHRpZW5lLCBzZWd1aWRhIGRlbCBlc3RyYXRvLg0KPGxpPkxhIG1heW9yw61hIGRlIGxvcyBwYWNpZW50ZXMgbm8gZXN0dXZpZXJvbiBpbmdyZXNhZG9zIGVuIGVsIFVDSSBvIGVuIFVDRQ0KPGxpPkVsIHBhZ28gaG9zcGl0YWxhcmlvIHByb21lZGlvIGZ1ZSBkZSAkNSc3MDYsMTA4IGNvbiB1bmEgZGVzdmlhY2nDs24gZGUgJDExJzQ0NywxMzUgZGUgbGEgbWVkaWEsIGxvIHF1ZSBpbmRpY2EgdW5hIGdyYW4gZGlzcGVyc2nDs24gZW4gbG9zIGRhdG9zLCB5IHBvc2libGUgcHJlc2VuY2lhIGRlIG91dGxpZXJzLg0KPHVsPg0KDQo8YnI+DQoNCkEgY29udGludWFjaW9uIHZlcmVtb3MgYWxndW5hcyBncmFmaWNhcyBxdWUgcGVybWl0ZW4gcmVhbGl6YXIgaW5mZXJlbmNpYXMgYWNlcmNhIGRlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgZGF0b3M6DQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NH0NCnJlcXVpcmUoc2NhbGVzKQ0KDQpkYXRhX3JlaG9zcCAlPiUNCiAgZmlsdGVyKHBhZ29faG9zcCA+IDAgJiBxdWlydXIgPT0gMCAmIHJlaG9zcF9vbXMgPT0gMSkgJT4lDQogIGdyb3VwX2J5KGZlY2hhX2luZ3Jlc28pICU+JQ0KICBzdW1tYXJpc2VfYWxsKH5zdW0ocGFnb19ob3NwKSkgJT4lDQogICAgZ2dwbG90KA0KICAgICAgYWVzKA0KICAgICAgICB4PWZlY2hhX2luZ3Jlc28sIA0KICAgICAgICB5PXBhZ29faG9zcCkpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBjb2xvciA9ICIjOTlDQ0ZGIiwgDQogICAgICBzaXplID0gMC4zKSArIA0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKHRpdGxlID0gIlBhZ28gSG9zcCBlbiBlbCB0aWVtcG8iLA0KICAgICAgICAgeD0gIkZlY2hhIEluZ3Jlc28iLA0KICAgICAgICAgeSA9ICJQYWdvIEhvc3AiKSArDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIA0KICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBkb2xsYXIpIC0+IHAxMQ0KDQpwMTEgPC0gZ2dwbG90bHkocDExKQ0KcDExDQpgYGANCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUUsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9DQpkYXRhX3JlaG9zcCAlPiUNCiAgZ3JvdXBfYnkoY2l1ZGFkKSAlPiUNCiAgc3VtbWFyaXNlX2FsbCh+c3VtKHJlaG9zcF9vbXMpKSAlPiUNCiAgZmlsdGVyKHJlaG9zcF9vbXMgPiA4KSAlPiUNCiAgICBnZ3Bsb3QoDQogICAgICBhZXMoZmlsbD1jaXVkYWQsDQogICAgICAgICAgeD1jaXVkYWQsIA0KICAgICAgICAgIHk9cmVob3NwX29tcykpICsNCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIGxhYnModGl0bGUgPSAiUmVob3NwaXRhbGl6YWNpb24gcG9yIGNpdWRhZCIsDQogICAgICAgICB4PSAiQ2l1ZGFkIiwNCiAgICAgICAgIHkgPSAiQ2FudC4gUmVob3NwIikgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQmx1ZXMiKS0+IHAxMg0KDQpwMTIgPC0gZ2dwbG90bHkocDEyKQ0KcDEyDQoNCmBgYA0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUUsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9DQogcmVxdWlyZShzY2FsZXMpDQogDQpkYXRhX3JlaG9zcCAlPiUNCiAgZmlsdGVyKHJlaG9zcF9vbXMgPiAwKSAlPiUNCiAgZ3JvdXBfYnkoZmVjaGFfaW5ncmVzbykgJT4lDQogIHN1bW1hcmlzZV9hbGwofnN1bShyZWhvc3Bfb21zKSkgJT4lDQogICAgZ2dwbG90KA0KICAgICAgYWVzKA0KICAgICAgICB4PWZlY2hhX2luZ3Jlc28sIA0KICAgICAgICB5PXJlaG9zcF9vbXMpKSArDQogICAgZ2VvbV9wb2ludChjb2xvcj0iIzk5Q0NGRiIsIA0KICAgICAgc2l6ZT0yKSArIA0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKHRpdGxlID0gIk51bWVybyBSZWhvc3AgZW4gZWwgdGllbXBvIiwNCiAgICAgICAgeD0gIkZlY2hhIFJlaG9zcC4iLA0KICAgICAgICB5ID0gIk51bS4gUmVob3NwLiIpICsNCiAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAtPiBwMTMNCiANCnAxMyA8LSBnZ3Bsb3RseShwMTMpDQpwMTMNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMiBpZD0iUGVyZGlkb3MiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBtYXJrZG93bj0iMSI+QW7DoWxpc2lzIGRlIFJlZ2lzdHJvcyBQw6lyZGlkb3M8L2gyPg0KDQpFbiBsYSBncsOhZmljYSBzaWd1aWVudGUgcG9kZW1vcyBvYnNlcnZhciBxdWUgaGF5IGVuIHRvdGFsIDQgdmFyaWFibGVzIHF1ZSBjb250aWVuZW4gcmVnaXN0cm9zIHZhY2lvczogZXN0cmF0bywgZXN0YWRvIGNpdmlsLCBpbmdyZXNvIHkgcHJvdmVlZG9yLg0KDQpBIG5pdmVsIGluZGl2aWR1YWwgZWwgcG9yY2VudGFqZSBkZSB2YWxvcmVzIHBlcmRpZG9zIHBhcmEgdG9kb3MgbG9zIGNhc29zIGVzIHN1cGVyaW9yIGFsIDI1JS4gRGUgZm9ybWEgY29tYmluYWRhIGhheSBtw6FzIGRlbCAzMCUgZGUgY2FtcG9zIHZhY8Otb3M7IHBvciBlbmRlIG5vIHBvZGVtb3MgZGVjaXIgcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZmFsdGUgdW4gdmFsb3IgZGVwZW5kZSBzb2xvIGRlbCB2YWxvciBvYnNlcnZhZG8sIHkgdXNhciB1biBtw6l0b2RvIHBhcmEgaW1wdXRhcmxvIChsYSBmb3JtYSBubyBlcyBhbGVhdG9yaWEpLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGV2YWwgPVRSVUUsIGVjaG8gPSBGQUxTRX0NCmFnZ3IoZGF0YV9yZWhvc3AsDQogICAgIGNvbCA9IGMoIiNDQ0U1RkYiLCAiIzk5Q0NGRiIpLA0KICAgICBjZXguYXhpcyA9IDAuNywNCiAgICAgcHJvcCA9IGMoVFJVRSwgRkFMU0UpLA0KICAgICBudW1iZXIgPSBUUlVFLA0KICAgICBnYXAgPSAxLjUsDQogICAgIGJvcmRlciA9IE5BLA0KICAgICBiYXJzID0gRkFMU0UsDQogICAgIHlsYWIgPSBjKCJQcm9wb3JjacOzbiBkZSBEYXRvcyBQZXJkaWRvcyIsICJDb21iaW5hY2lvbmVzIikpDQpgYGANCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+PC9kaXY+DQpEYWRvIGxvIGFudGVyaW9yLCBzZSBoYWNlIG5lY2VzYXJpbyBjb25zdHJ1aXIgdW5hIHRlcmNlcmEgY2F0ZWdvcsOtYSwgcG9yIGxvIG1lbm9zIHBhcmEgbGFzIHZhcmlhYmxlcyBxdWUgcG9zZWVuIG1lbm9zIGNhbXBvcyB2YWPDrW9zIChlc3RyYXRvIHkgZXN0YWRvIGNpdmlsKS4NCg0KUGFyYSBlc3RpbWFyIHNpIGV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBxdWUgcHVlZGEgZGVyaXZhcnNlIGVuIGNvbGluZWFsaWRhZCwgc2UgcHJvY2VkZSBwcmltZXJvIGEgdmVyaWZpY2FyIHF1ZSBsYXMgdmFyaWFibGVzIG5vIHBvc2VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIHVuYSB2ZXogcmVhbGl6YWRvIGVzdG8sIHNlIGVsaWdlIGVsIHRlc3QgZGUgU3BlYXJtYW4gcGFyYSBoYWxsYXIgbGEgY29ycmVsYWNpw7NuIGxpbmVhbCBwb3IgYXRyaWJ1dG8uPC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KZGF0YV9yZWhvc3AgJT4lDQogIHNlbGVjdChwYWdvX2hvc3AsIA0KICAgICAgICAgZGlhc191Y2ksDQogICAgICAgICBkaWFzX3VjZSwNCiAgICAgICAgIGRpYXNfaG9zcCwNCiAgICAgICAgIHJlaG9zcF9vbXMpIC0+IGRhdGFfbnVtDQoNCm5vcm1fdGVzdCA8LSBsYXBwbHkoZGF0YV9udW0sIGxpbGxpZS50ZXN0KQ0KbHJlcyA8LSBzYXBwbHkobm9ybV90ZXN0LCBgW2AsIGMoInN0YXRpc3RpYyIsInAudmFsdWUiKSkNCnQobHJlcykNCmBgYA0KDQo8ZGl2IHN0eWxlPSAidGV4dC1hbGlnbjpqdXN0aWZ5Ij4NCkxvcyByZXN1bHRhZG9zIGNvbmZpcm1hbiBxdWUgbmluZ3VuYSBkZSBsYXMgdmFyaWFibGVzIHBlc2VudGEgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIHkgbGFzIGNvcnJlbGFjaW9uZXMgcmVsYWNpb25hZGFzIGEgY29udGludWFjacOzbiwgdmVyaWZpY2FuIHBvc2libGVzIGFzb2NpYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIGRlIGxvcyBkw61hcyBlbiBxdWUgZWwgcGFjaWVudGUgZXN0dXZvIGludGVybmFkbyBlbiBsYSBVbmlkYWQgZGUgQ3VpZGFkb3MgSW50ZW5zaXZvcywgZW4gbGEgVW5pZGFkIGRlIEN1aWRhZG9zIEVzcGVjaWFsZXMgeSBsb3MgZMOtYXMgcXVlIGVsIHBhY2llbnRlIGVzdHV2byBob3NwaXRhbGl6YWRvLiBQb3IgY29ub2NpbWllbnRvIGRlIGZhY3RvLCBsYSByZWxhY2nDs24gZW50cmUgbGEgdmFyaWFibGUgImRpYXNfdWNpIiB5ICJkaWFzX3VjZSIgZXMgZW50ZW5kaWJsZSwgeWEgcXVlIGN1YW5kbyB1biBwYWNpZW50ZSBxdWUgaGEgcGFzYWRvIHBvciBsYSBVbmlkYWQgZGUgQ3VpZGFkb3MgSW50ZW5zaXZvcyBwYXPDsyBzdSBtb21lbnRvIGRlIGNyaXNpcyB5IHN1IGVzdGFkbyBkZSBzYWx1ZCBlcyBtw6FzIGVzdGFibGUsIHN1ZWxlIHNlciByZW1pdGlkbyBhIGxhIFVuaWRhZCBkZSBDdWlkYWRvcyBFc3BlY2lhbGVzLiA8L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpjb3JyX251bSA8LSByb3VuZChjb3IoZGF0YV9udW0pLDQpDQpwLm1hdCA8LSBjb3JfcG1hdChkYXRhX251bSwgbWV0aG9kID0gInNwZWFybWFuIikNCg0KZ2djb3JycGxvdChjb3JyX251bSwgDQogICAgICAgICAgIHR5cGUgPSAibG93ZXIiLA0KICAgICAgICAgICBvdXRsaW5lLmNvbCA9ICJ3aGl0ZSIsDQogICAgICAgICAgIHAubWF0ID0gcC5tYXQsDQogICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgIGdndGhlbWUgPSBnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsLA0KICAgICAgICAgICBsYWIgPSBUUlVFLA0KICAgICAgICAgICBjb2xvcnMgPSBjKCIjOTlDQ0ZGIiwgIndoaXRlIiwgIiMwMDY2Q0MiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJDb3JyZWxhY2lvbiBlbnRyZSB2YXJpYWJsZXMgbnVtw6lyaWNhcyIpDQpgYGANCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+PC9kaXY+DQpTaW4gZW1iYXJnbywgbGFzIGNvcnJlbGFjaW9uZXMgb2J0ZW5pZGFzIG5vIGN1bXBsZW4gdW4gdW1icmFsIHN1ZmljaWVudGUgcGFyYSBjb25zaWRlcmFybGFzIGltcG9ydGFudGVzLCBwb3IgZW5kZSBzZSBwcm9jZWRlIGEgY29uc2VydmFybGFzIHkgZXZhbHVhciBtw6FzIGFkZWxhbnRlIHNpIGVzIHByZWNpc28gZWxpbWluYXJsYXMgZGVmaW5pdGl2YW1lbnRlLiBQb3Igb3RybyBsYWRvLCBsYSB2YXJpYWJsZSBjYXRlZ29yw61hIHkgZGlhZ27Ds3N0aWNvIGVzdMOhbiBhbHRhbWVudGUgY29ycmVsYWNpb25hZGFzIGNvbiBsYSB2YXJpYWJsZSBlbmTDs2dlbmEsIHBvciBsbyBxdWUgZXMgbmVjZXNhcmlvIGVsaW1pbmFybGFzIGRlbCBhbsOhbGlzaXMsIHBhcmEgbm8gaW5jdXJyaXIgZW4gcG9zaWJsZXMgc29icmVhanVzdGVzIGVuIGxhIGV0YXBhIGRlIG1vZGVsYWRvLg0KDQpDb21vIHNlIGhhYsOtYSBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhbsOhbGlzaXMgZGUgZGF0b3MgcGVyZGlkb3MgbyBudWxvcywgc2UgZGVjaWRlIGRlc2NhcnRhciBsYSB2YXJpYWJsZSBpbmdyZXNvIHlhIHF1ZSBjb250aWVuZSBtYXMgZGUgdW4gMzAlIGVuIGRhdG9zIHBlcmRpZG9zLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCg0KZGF0YV9yZWhvc3AgJT4lDQogIG11dGF0ZShlc3RyYXRvID0gaWZlbHNlKGlzLm5hKGVzdHJhdG8pIHwgZXN0cmF0byA9PSAtMSB8IGVzdHJhdG8gPT0gMCwgIlNpbiBJbmZvcm1hY2lvbiIsIGVzdHJhdG8pLA0KICAgICAgICAgZXN0X2NpdmlsID0gaWZlbHNlKGlzLm5hKGVzdF9jaXZpbCksICJTaW4gSW5mb3JtYWNpb24iLCBlc3RfY2l2aWwpLA0KICAgICAgICAgaW5ncmVzbyA9IGlmZWxzZShpcy5uYShpbmdyZXNvKSwgIlNpbiBJbmZvcm1hY2lvbiIsIGluZ3Jlc28pLA0KICAgICAgICAgcHJvdmVlZG9yID0gaWZlbHNlKGlzLm5hKHByb3ZlZWRvciksICJTaW4gSW5mb3JtYWNpb24iLCBwcm92ZWVkb3IpLA0KICAgICAgICAgcXVpcnVyID0gaWZlbHNlKHF1aXJ1ciA9PSAxLCAnU2knLCAnTm8nKSwNCiAgICAgICAgIGVkYWQgPSBjYXNlX3doZW4oIGVkYWQgPD0gMzAgfiAiMTgtMzAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA+PSAzMSAmIGVkYWQgPD0gNDAgfiAiMzEtNDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA+PSA0MSAmIGVkYWQgPD0gNTAgfiAiNDEtNTAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA+PSA1MSAmIGVkYWQgPD0gNjAgfiAiNTEtNjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA+PSA2MSAmIGVkYWQgPD0gNzAgfiAiNjEtNzAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA+PSA3MSAmIGVkYWQgPD0gODAgfiAiNzEtODAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA+PSA4MSB+ICI4MSsiKSwNCiAgICAgICAgIG1hcmNhcyA9IGN1dChtYXJjYXMsIGJyZWFrcyA9ICgwOjMpKjIsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSksDQogICAgICAgICBlc3RfY2l2aWwgPSBhcy5mYWN0b3IoZXN0X2NpdmlsKSwNCiAgICAgICAgIGdlbmVybyA9IGFzLmZhY3RvcihnZW5lcm8pLA0KICAgICAgICAgcXVpcnVyID0gYXMuZmFjdG9yKHF1aXJ1ciksDQogICAgICAgICByYW1vID0gYXMuZmFjdG9yKHJhbW8pLA0KICAgICAgICAgZWRhZCA9IGFzLmZhY3RvcihlZGFkKSwNCiAgICAgICAgIGVzdHJhdG8gPSBhcy5mYWN0b3IoZXN0cmF0bykpICU+JQ0KICBzZWxlY3QoLWRpYWdub3MsIC1jYXRlZ29yaWEsIC1mZWNoYV9pbmdyZXNvLCAtaW5ncmVzbywgLXByb3ZlZWRvciwgLWNpdWRhZCkgLT4gZGF0YV9yZWhvc3ANCg0Kc3RyKGRhdGFfcmVob3NwKQ0KYGBgDQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KPGhyPg0KPGgyIGlkPSJBbmFsaXNpcyIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiIG1hcmtkb3duPSIxIj5BbsOhbGlzaXMgRXhwbG9yYXRvcmlvPC9oMj4NCg0KPGgzIGlkPSJBbmFsaXNpc0NvbiIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsibWFya2Rvd249IjEiPkFuw6FsaXNpcyB1bml2YXJpYWRvIC0gdmFyaWFibGVzIGNvbnRpbnVhczwvaDM+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRXMgZXZpZGVudGUgbGEgZXhpc3RlbmNpYSB0YW1iacOpbiwgZGUgdmFsb3JlcyBhdMOtcGljb3MgbXV5IG1hcmNhZG9zIHRhbnRvIGVuIGVsIG51bcOpcm8gZGUgZMOtYXMgZGUgaG9zcGl0YWxpemFjacOzbiwgY29tbyBlbiBsb3MgbsO6bWVyb3MgZGUgZMOtYXMgcXVlIGVsIHBhY2llbnRlIGVzdHV2byBlbiBsYSBVbmlkYWQgZGUgQ3VpZGFkbyBJbnRlbnNpdm9zIHkgRXNwZWNpYWxlcywgZW4gZMOzbmRlIGxvcyB2YWxvcmVzIGF0w61waWNvcyBtw6FzIGdyYW5kZXMgc3VjZWRlbiBlbiBsb3MgZXZlbnRvcyBxdWUgbm8gZGVzZW5jYWRlbmFyb24gZW4gcmVob3NwaXRhbGl6YWNpw7NuLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCg0KZGF0YV9yZWhvc3AgJT4lDQogIGZpbHRlcihkaWFzX3VjaSA+IDApICU+JQ0KICBnZ3Bsb3QgKC4sIGFlcyAoIGRpYXNfdWNpLCBjb2xvciA9IGFzLmZhY3RvcihyZWhvc3Bfb21zKSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0id2hpdGUiLCBhbHBoYT0wLjUsIHBvc2l0aW9uPSJpZGVudGl0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh4ID0gIkTDrWFzIFVDSSIsIA0KICAgICAgIHkgPSAiRnJlY3VlbmNpYSBSZWxhdGl2YSIsIA0KICAgICAgIGZpbGwgPSAiICIpICsNCiAgZ2d0aXRsZSgiRMOtYXMgZW4gVW5pZGFkIGRlIEN1aWRhZG9zIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIC0+IHAxDQoNCmRhdGFfcmVob3NwICU+JQ0KICBmaWx0ZXIoZGlhc191Y2UgPiAwKSAlPiUNCiAgZ2dwbG90ICguLCBhZXMgKCBkaWFzX3VjZSwgY29sb3IgPSBhcy5mYWN0b3IocmVob3NwX29tcykpKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGw9IndoaXRlIiwgYWxwaGE9MC41LCBwb3NpdGlvbj0iaWRlbnRpdHkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeCA9ICJEw61hcyBVQ0UiLCANCiAgICAgICB5ID0gIkZyZWN1ZW5jaWEgUmVsYXRpdmEiLCANCiAgICAgICBmaWxsID0gIlJlaG9zcGl0YWxpemFjacOzbiIpICsNCiAgZ2d0aXRsZSgiTsO6bWVybyBkZSBkw61hcyBlbiBVbmlkYWQgZGUgQ3VpZGFkb3MiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIA0KICAgIHNjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpIC0+IHAyDQoNCnAxIDwtIGdncGxvdGx5KHAxKQ0KcDIgPC0gZ2dwbG90bHkocDIpDQoNCnN1YnBsb3QocDEsIHAyLCB0aXRsZVggPSBUUlVFLCB0aXRsZVkgPSBUUlVFKSAlPiUNCiAgbGF5b3V0KHNob3dsZWdlbmQgPSAoRkFMU0UpKQ0KYGBgDQoNCjxkaXYgc3R5bGU9ICJ0ZXh0LWFsaWduOmp1c3RpZnkiPjwvZGl2Pg0KQ29uIGVsIGFuw6FsaXNpcyBhbnRlcmlvciBubyBzw7NsbyBzZSBsb2dyYSBpZGVudGlmaWNhciBsYSBwcmVzZW5jaWEgZGUgdmFsb3JlcyBhdMOtcGljb3MsIHNpbm8gcXVlIHRhbWJpw6luIGVzIHBvc2libGUgZXZpZGVuY2lhciBxdWUgbG9zIGRhdG9zIHNlIGVuY3VlbnRyYW4gYWx0YW1lbnRlIGRlc2JhbGFuY2VhZG9zLiBFbiBlbCBjYXNvIGRlIGxvcyBvdXRsaWVycyBzZSB0cnVuY2Fyw6EgZW4gbG9zIGNhc29zIGVuIHF1ZSBzZWEgbmVjZXNhcmlvLCBpbXB1dGFuZG8gbG9zIHZhbG9yZXMgcXVlIHN1cGVyZW4gY2llcnRvIGzDrW1pdGUgZW4gZWwgcGVyY2VudGlsLCB0YW50byBtYXlvciBjb21vIG1lbm9yLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCmRhdGFfcmVob3NwICU+JQ0KICBtdXRhdGUocGFnb19ob3NwID0gaWZlbHNlKHF1aXJ1ciA9PSAiU2kiICYgcmVob3NwX29tcyA9PSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaWVyKG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgcXVpcnVyID09ICJTaSIgJiByZWhvc3Bfb21zID09IDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gInBhZ29faG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk3KSwgcGFnb19ob3NwKSwNCiAgICAgICAgIHBhZ29faG9zcCA9IGlmZWxzZShxdWlydXIgPT0gIlNpIiAmIHJlaG9zcF9vbXMgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHF1aXJ1ciA9PSAiU2kiICYgcmVob3NwX29tcyA9PSAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gInBhZ29faG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk4KSwgcGFnb19ob3NwKSwNCiAgICAgICAgIHBhZ29faG9zcCA9IGlmZWxzZShxdWlydXIgPT0gIk5vIiAmIHJlaG9zcF9vbXMgPT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHF1aXJ1ciA9PSAiTm8iICYgcmVob3NwX29tcyA9PSAwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJwYWdvX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45NyksIHBhZ29faG9zcCksIA0KICAgICAgICAgcGFnb19ob3NwID0gaWZlbHNlKHF1aXJ1ciA9PSAiTm8iICYgcmVob3NwX29tcyA9PSAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaWVyKG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgcXVpcnVyID09ICJObyIgJiByZWhvc3Bfb21zID09IDEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gInBhZ29faG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk4KSwgcGFnb19ob3NwKSwNCiAgICAgICAgIGRpYXNfaG9zcCA9IGlmZWxzZShyZWhvc3Bfb21zID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCByZWhvc3Bfb21zID09IDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJkaWFzX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45OSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHJlaG9zcF9vbXMgPT0gMSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImRpYXNfaG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk5KSksDQogICAgICAgICBkaWFzX3VjaSA9IGlmZWxzZShyZWhvc3Bfb21zID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHJlaG9zcF9vbXMgPT0gMCAmIGRpYXNfdWNpID4gMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImRpYXNfdWNpIiwgcV9taW4gPSAwLCBxX21heCA9IDAuOTk5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkaWFzX3VjaSksDQogICAgICAgICBkaWFzX3VjZSA9IGlmZWxzZShyZWhvc3Bfb21zID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHJlaG9zcF9vbXMgPT0gMCAmIGRpYXNfdWNlID4gMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImRpYXNfdWNlIiwgcV9taW4gPSAwLCBxX21heCA9IDAuOTk5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkaWFzX3VjaSkpIC0+IGRhdGFfcmVob3NwDQpgYGANCg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCg0KcDMgPC0gbXlib3hwbG90KG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgcGFnb19ob3NwID4gMCksIA0KICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgIG15b3V0Y29tZSA9ICJwYWdvX2hvc3AiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gIlBhZ28gaG9zcGl0YWxpemFjacOzbiIsIA0KICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiUGFnbyBEaWFnIiwgDQogICAgICAgICAgICAgICAgbXlfZmlsbCA9ICIiKQ0KDQpwNCA8LSBteWJveHBsb3QobXlkYXRhID0gZGF0YV9yZWhvc3AsIA0KICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgIG15b3V0Y29tZSA9ICJkaWFzX2hvc3AiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gIlRvdGFsIGRpYXMgaG9zcGl0YWxpemFkbyIsIA0KICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRGlhcyBob3NwaXRhbGl6YWNpw7NuIiwgDQogICAgICAgICAgICAgICAgbXlfZmlsbCA9ICIiKQ0KDQpwNSA8LSBteWJveHBsb3QobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCBkaWFzX3VjaSA+IDApLCANCiAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAiZGlhc191Y2kiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gICJUb3RhbCBkw61hcyBVQ0kiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkRpYXMgVUNJIiwgDQogICAgICAgICAgICAgICAgbXlfZmlsbCA9ICIiKQ0KDQpwNiA8LSBteWJveHBsb3QobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCBkaWFzX3VjZSA+IDApLCANCiAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAiZGlhc191Y2UiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gIlRvdGFsIGTDrWFzIFVDRSIsIA0KICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRGlhcyBVQ0UiLCANCiAgICAgICAgICAgICAgICBteV9maWxsID0gIiIpDQoNCnAzIDwtIGdncGxvdGx5KHAzKQ0KcDQgPC0gZ2dwbG90bHkocDQpDQpwNSA8LSBnZ3Bsb3RseShwNSkNCnA2IDwtIGdncGxvdGx5KHA2KQ0KDQpzdWJwbG90KHA1LCBwNiwgcDMsIHA0LCANCiAgICAgICAgbnJvd3MgPSAyLCBuY29sKDIpLCANCiAgICAgICAgdGl0bGVYID0gVFJVRSwgdGl0bGVZID0gVFJVRSkgJT4lDQogIGxheW91dChzaG93bGVnZW5kID0gKEZBTFNFKSkNCg0KDQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSAidGV4dC1hbGlnbjpqdXN0aWZ5Ij48L2Rpdj4NClNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBlbiBsYSB2YXJpYWJsZSBkw61hcyBVQ0ksIGNvcnJlc3BvbmRpZW50ZSBhbCBwcmltZXIgZGlhZ27Ds3N0aWNvLCBubyBwYXJlY2UgaGFiZXIgdW5hIGRpZmVyZW5jaWEgc2lnbmlmaWNhdGl2YSBlbiBsYSBkaXN0cmlidWNpw7NuIGFsIGRpc2NyaW1pbmFyIHBvciBsYSB2YXJpYWJsZSBvYmpldGl2byBiaW5hcmlhLCBlcyBkZWNpciwgZW50cmUgbG9zIGNhc29zIGRlIHJlaG9zcGl0YWxpemFjacOzbiAoMSkgeSBjYXNvcyBkZSBubyByZWhvc3BpdGFsaXphY2nDs24gKDApLiBBZGljaW9uYWxtZW50ZSwgbGEgZGlzdGlidWNpw7NuIGVuIGFtYmFzIHZhcmlhYmxlcyBubyBlcyBzaW3DqXRyaWNhLiANCg0KQSBwZXNhciBkZSBxdWUgbG9zIGRhdG9zIHNlIGVuY3VlbnRyYW4gYmFzdGFudGUgZGlzcGVyc29zLCBzZSBsb2dyYSBpZGVudGlmaWNhciBkaWZlcmVuY2lhcyBlbiBsYSB2YXJpYWJsZSBkZWwgcGFnbyAtY29uIHZhbG9yZXMgbcOhcyBhbHRvcyBlbiBsb3MgY2FzbyBlbiBxdWUgbm8gdGVybWluw7MgZGUgYnVldm8gaG9zcGl0YWxpemFkbywgeSBlbiBlbCBjYXPDsyBkZWwgbsO6bWVybyBkZSBkw61hcyBob3NwaXRhbGl6YWRvIGxvcyByYW5nb3Mgc29uIG11Y2hvIG3DoXMgcGVxdWXDsW9zIGN1YW5kbyBoYXkgdW5hIHJlaG9zcGl0YWxpemFjacOzbi48L2Rpdj4NCg0KPGhyPg0KPGgzIGlkPSJBbmFsaXNpc0NhciJzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd24gPSAiMSI+QW7DoWxpc2lzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXM8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCk9ic2VydmFuZG8gbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgbGEgZGlmZXJlbmNpYSBlbnRyZSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGVsIGV2ZW50byBvY3VycmEgKGhheWEgcmVob3NwaXRhbGl6YWNpw7NuKSBvIG5vLCBzZSBwdWVkZSBldmlkZW5jaWFyIHPDs2xvIGVuIGFsZ3VuYXMgY2xhc2VzIHBvciBjYXRlZ29yw61hLCBwZXJvIGVuIGdlbmVyYWwsIGxhcyBwcm9wb3JjaW9uZXMgc3VlbGVuIHNlciBiYXN0YW50ZXMgc2ltaWxhcmVzLCBwb3IgbG8gcXVlIG5vIGVzIHBvc2libGUgZWxhYm9yYXIgYSBwcmlvcmkgdW5hIGhpcMOzdGVzaXMgcXVlIGVzdGlwdWxlIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVuIGxhcyBkaXN0cmlidWNpb25lcywgcG9yIGxvIG1lbm9zIHBhcmEgbmluZ3VuYSBkZSBsYXMgZG9zIHZhcmlhYmxlcyByZWxhY2lvbmFkYXMgZW4gZWwgZ3LDoWZpY28gYSBjb250aW51YWNpw7NuLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCg0KcDcgPC0gbXlnZW9tX2JhcihteWRhdGEgPSBkYXRhX3JlaG9zcCwgDQogICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAiZWRhZCIsIA0KICAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgICBteXRpdGxlID0gIkVkYWQiLCANCiAgICAgICAgICAgICAgICAgbXlsYWJlbF94ID0gIiIsIA0KICAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRnJlY3VlbmNpYSIsIA0KICAgICAgICAgICAgICAgICBteV9maWxsID0gIlJlaG9zcGl0YWxpemFjacOzbiIsIA0KICAgICAgICAgICAgICAgICBteV9hbmdsZSA9IE5VTEwsDQogICAgICAgICAgICAgICAgIG15X2xlZ2VuZCA9ICJyaWdodCIpDQoNCnA4IDwtIG15Z2VvbV9iYXIobXlkYXRhID0gZGF0YV9yZWhvc3AsIA0KICAgICAgICAgICAgICAgICAgbXlleHBvc3VyZSA9ICJlc3RyYXRvIiwgDQogICAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJFc3RyYXRvIiwgDQogICAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRnJlY3VlbmNpYSIsIA0KICAgICAgICAgICAgICAgICAgbXlfZmlsbCA9ICJSZWhvc3BpdGFsaXphY2nDs24iLCANCiAgICAgICAgICAgICAgICAgIG15X2FuZ2xlID0gTlVMTCwNCiAgICAgICAgICAgICAgICAgIG15X2xlZ2VuZCA9ICJub25lIikNCg0KZ3JpZC5hcnJhbmdlKHA3LA0KICAgICAgICAgICAgIHA4KQ0KDQpgYGANCg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+PC9kaXY+DQpQb3Igb3RybyBsYWRvLCBlbCBhdHJpYnV0byBxdWUgaW5kaWNhIGVsIGhlY2hvIGRlIHF1ZSBzZSBoYXlhbiByZWFsaXphZG8gcHJvY2VkaW1pZW50b3MgcXVpcsO6cmdpY29zIGR1cmFudGUgbGEgcHJpbWVyYSBob3NwaXRhbGl6YWNpw7NuIG11ZXN0cmFuIGNpZXJ0YSBkaWZlcmVuY2lhIGVuIGxhIGRpc3RyaWJ1acOzbiBwb3IgZ3J1cG87IGVzIG3DoXMgcHJvYmFibGUgcXVlIGxhIHBlcnNvbmEgZGViYSBzZXIgcmVob3NwaXRhbGl6YWRhIGRlIG51ZXZvLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCg0KcDkgPC0gbXlnZW9tX2JhcihteWRhdGEgPSBkYXRhX3JlaG9zcCwgDQogICAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gInF1aXJ1ciIsIA0KICAgICAgICAgICAgICAgICAgbXlvdXRjb21lID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICAgIG15dGl0bGUgPSAiUHJvYyBxdWlyw7pyZ2ljbyIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF94ID0gIiIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkZyZWN1ZW5jaWEiLCANCiAgICAgICAgICAgICAgICAgIG15X2ZpbGwgPSAiUmVob3NwaXRhbGl6YWNpw7NuIiwgDQogICAgICAgICAgICAgICAgICBteV9hbmdsZSA9IE5VTEwsDQogICAgICAgICAgICAgICAgICBteV9sZWdlbmQgPSAicmlnaHQiKQ0KDQpwMTAgPC0gbXlnZW9tX2JhcihteWRhdGEgPSBkYXRhX3JlaG9zcCwgDQogICAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gImVzdF9jaXZpbCIsIA0KICAgICAgICAgICAgICAgICAgbXlvdXRjb21lID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICAgIG15dGl0bGUgPSAiRXN0YWRvIGNpdmlsIiwgDQogICAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRnJlY3VlbmNpYSIsIA0KICAgICAgICAgICAgICAgICAgbXlfZmlsbCA9ICJSZWhvc3BpdGFsaXphY2nDs24iLCANCiAgICAgICAgICAgICAgICAgIG15X2FuZ2xlID0gTlVMTCwNCiAgICAgICAgICAgICAgICAgIG15X2xlZ2VuZCA9ICJyaWdodCIpDQoNCmdyaWQuYXJyYW5nZShwOSwNCiAgICAgICAgICAgICAgcDEwLA0KICAgICAgICAgICAgICBuY29sID0gMSwNCiAgICAgICAgICAgICAgbnJvdyA9IDIpDQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSAidGV4dC1hbGlnbjpqdXN0aWZ5Ij48L2Rpdj4NCkNvbiBlbCBvYmpldGl2byBkZSBlbnJpcXVlY2VyIGVsIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8sIHNlIGNhbGN1bGFyw6FuIGRvcyBtZWRpZGFzIG11eSBjb23Dum5lcyBkZSBsYSB0ZW9yw61hIGRlIGxhIGluZm9ybWFjacOzbiwgw6lzdGFzIHBlcm1pdGVuIGluZmVyaXIgYWxnbyBkZWwgcG9kZXIgcHJlZGljdGl2byBxdWUgcHVlZGVuIHRlbmVyIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMsIGFudGVzIGRlIGhhY2VyIHBhcnRlIGRlIHVuIG1vZGVsby48L2Rpdj4NCg0KW1ZvbHZlciBhbCDDjW5kaWNlXSgjaW5kaWNlKTwvZGl2Pg0KDQo8aHI+DQo8aDIgaWQ9IkFuYWxpc2lzV09FIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd24gPSIxIj5BbsOhbGlzaXMgZGUgY2xhc2lmaWNhY2nDs24gYmluYXJpYSB1c2FuZG8gV09FIHkgZWwgSVY8L2gyPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIHBlc28gZGUgbGEgZXZpZGVuY2lhIChXT0UpIHkgZWwgdmFsb3IgZGUgbGEgaW5mb3JtYWNpw7NuIChJVikgYXl1ZGFuLCBlbnRyZSBvdHJhcyBjb3NhcywgYSBkZXRlcm1pbmFyIGxhIGNvbnRyaWJ1Y2nDs24gaW5kZXBlbmRpZW50ZSBkZSBjYWRhIHZhcmlhYmxlIGFsIHJlc3VsdGFkbywgeSBkZXRlY3RhciByZWxhY2lvbmVzIGxpbmVhbGVzIHkgbm8gbGluZWFsZXMuIEVsIFdPRSBtaWRlIGxhIHJlbGFjacOzbiBlbnRyZSBsYSB2YXJpYWJsZSBwcmVkaWN0aXZhIHkgZWwgb2JqZXRvIGJpbmFyaW8sIG1pZW50cmFzIHF1ZSBlbCBJViBtaWRlIGxhIGZ1ZXJ6YSBwcmVkaWN0aXZhIGRlIGVzYSByZWxhY2nDs24uDQoNCkxhIHRhYmxhIGEgY29udGludWFjacOzbiBjb250aWVuZSBsb3MgdmFsb3JlcyBkZWwgInZhbG9yIGRlIGxhIGluZm9ybWFjacOzbiIgY29uIHkgc2luIGVsIGFqdXN0ZSBkZXJpdmFkbyBkZSBsYSB2YWxpZGFjacOzbiBjcnV6YWRhLiBDdWFuZG8gc2UgcmVhbGl6YSBlbCBhanVzdGUgY29uIGVsIG9iamV0aXZvIGRlIHF1ZSBsb3MgcmVzdWx0YWRvcyBzZWFuIG3DoXMgZXN0YWJsZXMsIHRhbnRvIHBhZ28gZGVsIGRpYWduw7NzdGljbywgZWwgaGVjaG8gZGUgcXVlIGVsIHBhY2llbnRlIGhhbGxhIHBhc2FkbyBwb3IgbGEgVW5pZGFkIGRlIGN1aWRhZG9zLCB5IHNpIGZ1ZXJvbiByZWFsaXphZG9zIHByb2NlZGltaWVudG9zIHF1aXLDunJnaWNvcyBzZXLDoW4gbGFzIMO6bmljYXMgdmFyaWFibGVzIGNvbiBzdWZpY2llbnRlIGNhcGFjaWRhZCBkZSBwcmVkaWNjacOzbiBhIG5pdmVsIGluZGl2aWR1YWwgeSB1bml2YXJpYWJsZSAoSXYgPiAwLjA1KS4gQ3VhbmRvIHNlIHJlbGFqYSBlbCBzdXB1ZXN0bywgSVYgc2luIHJlc3RhciBlbCBwZW5hbHR5LCBzZSBpbmNsdWlyw61hbiBsb3MgZMOtYXMgZW4gcXVlIGVzdHV2byBob3NwaXRhbGl6YWRvLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnNldC5zZWVkKDEyMzQpDQpkYXRhX3JlaG9zcCA8LSBkYXRhX3JlaG9zcCAlPiUNCiAgbXV0YXRlKGlkID0gMTpucm93KC4pKSANCg0KZGF0YV9yZWhvc3AgJT4lDQogIHNhbXBsZV9mcmFjKHNpemUgPSAuNzApIC0+IHRyYWluDQoNCmRhdGFfcmVob3NwICU+JQ0KICBhbnRpX2pvaW4oeCA9IC4sDQogICAgICAgICAgICB5ID0gdHJhaW4sIA0KICAgICAgICAgICAgYnkgPSAiaWQiKSAtPiB0ZXN0DQogIA0KdHJhaW4gPC0gc2VsZWN0KC5kYXRhID0gdHJhaW4sIC1pZCkNCnRlc3QgPC0gc2VsZWN0KC5kYXRhID0gdGVzdCwgLWlkKQ0KDQpJViA8LSBjcmVhdGVfaW5mb3RhYmxlcyhkYXRhID0gdHJhaW4sDQogICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0ZXN0LA0KICAgICAgICAgICAgICAgICAgIHkgPSAicmVob3NwX29tcyIpDQoNCmthYmxlX3N0eWxpbmcoa2FibGUoSVYkU3VtbWFyeSksIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgcm93X2xhYmVsX3Bvc2l0aW9uID0gMSwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQpgYGANCjxkaXYgc3R5bGU9ICJ0ZXh0LWFsaWduOmp1c3RpZnkiPg0KRGUgYWN1ZXJkbyBhbCBwb2RlciBwcmVkaWN0aXZvIGRlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMsIHNlIGVsaWdlbiBhcXVlbGxhcyBjdXlvIFZhbG9yIGRlIGxhIGluZm9ybWFjacOTbiAoSVYpIHNlYSBzdXBlcmlvciBhbCAyJSAoMCwwMikuIExhcyB2YXJpYWJsZXMgY29uIElWIGluZmVyaW9yZXMgYSBlc3RlIHZhbG9yIHNlIGNvbnNpZGVyYW4gaW1wcmVkaWN0aXZhcyB5IHNlIGRlY2lkZSBkZXNjYXJ0YXJsYXMuIExhcyB2YXJpYWJsZXMgcXVlIGNvbnRpbnVhbiwgZW4gb3JkZW4gZGUgcmVsZXZhbmNpYSBzZWd1biBzdSBwb2RlciBwcmVkaWN0b3IsIHNvbjoNCg0KPHVsPg0KPGxpPnBhZ29faG9zcDwvbGk+DQo8bGk+cXVpcnVyPC9saT4NCjxsaT5kaWFzX3VjZTwvbGk+DQo8bGk+ZGlhc191Y2k8L2xpPg0KPGxpPnByb3ZlZWRvcjwvbGk+DQo8bGk+ZGlhc19ob3NwPC9saT4NCjxsaT5lZGFkPC9saT4NCjxsaT5nZW5lcm88L2xpPg0KPGxpPmNpdWRhZDwvbGk+DQo8L3VsPg0KDQoNClNpbiBlbWJhcmdvLCB0YW50byBsYSBjaXVkYWQsIGNvbW8gZWwgcHJvdmVlZG9yIG5vIHNlcsOhbiB0ZW5pZG9zIGVuIGN1ZW50YSwgcG9yIHF1ZSBwdWVkZW4gbGxlZ2FyIGEgY29uZGljaW9uYXIgbnVlc3RyYSB2YXJpYWJsZSBvYmpldGl2by4gQWRpY2lvbmFsbWVudGUsIGxvIGTDrWFzIFVDRSB5IFVDSSBwYXJlY2VuIGVzdGFyIGFsdGFtZW50ZSBjb3JyZWxhY2lvbmFkb3MgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvLCBnZW5lcmFuZG8gdW5hIHNvYnJlcHJlZGljY2nDs24uIFNlIGV2YWzDumEgYWRlbWFzIGxhcyBjb25kaWNpb25lcyBxdWUgcGVybWl0ZW4gZ2VuZXJhciBlc3RhcyBkb3MgdWx0aW1hcyB2YXJpYWJsZXMgZW5jb250cmFuZG8gcXVlIHNvbG8gc2UgYWxtYWNlbmFuIGN1YW5kbyBlbCB2YWxvciBwYWdhZG8gaGFzdGEgZWwgbW9tZW50byBlcyBjZXJvOyBwb3IgdG9kbyBlc3RvIGVzdGFzIGRvcyB2YXJpYWJsZXMgdGFtcG9jbyBzZXLDoW4gdGVuaWRhcyBlbiBjdWVudGEuDQoNCkVuZm9jYW5kb25vcyBlbiBlbCBwYWdvIGRlbCBkaWFnbsOzc3RpY28sIGVsIGN1YWwsIGVzIHVuYSBkZSBsYXMgdmFyaWFibGVzIGNvbiBtYXlvciBpbmZsdWVuY2lhLCBlbCBXT0Ugbm9zIGluZGljYSB1bmEgcmVsYWNpw7NuIG5vIGxpbmVhbCwgY29uIHVuIGluY3JlbWVudG8gZW4gZWwgV09FIGEgbWVkaWRhIHF1ZSBkaXNtaW51eWUgZWwgcmFuZ28gZGUgcGFnbyBlbiBlbCBkaWFnbsOzc3RpY28uPC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0Ka2FibGVfc3R5bGluZyhrYWJsZShJViRUYWJsZXMkcGFnb19ob3NwKSwgDQogICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICByb3dfbGFiZWxfcG9zaXRpb24gPSAxLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCm4gPC0gbmFtZXMoSVYkVGFibGVzKQ0KZm9yIChpIGluIDE6bGVuZ3RoKG4pKXsNCiAgIHBsb3RfaW5mb3RhYmxlcyhJViwgbltpXSl9DQoNCk11bHRpUGxvdChJViwgSVYkU3VtbWFyeSRWYXJpYWJsZVtjKDEsMiwzLDQsNiwxMCldKQ0KYGBgDQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KPGhyPg0KPGgyIGlkPSJNb2RlbG8iIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBtYXJrZG93bj0iMSI+TW9kZWxvPC9hPjwvaDI+DQo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFbCBvYmpldGl2byBwcmluY2lwYWwgZGVsIGFuw6FsaXNpcyBlcyBlc3RpbWFyIHVuIG1vZGVsbyBwcmVkaWN0aXZvIGNvbiBlbCBjdcOhbCBzZSBwdWVkYSBlc3RpbWFyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gcGFjaWVudGUgdGVybWluZSBlbiB1bmEgcmVob3NwaXRhbGl6YWNpw7NuLCBhc29jaWFkYSBhIHVuIGRpYW5nw7NzdGljbyBhbnRlcmlvci4gUGFyYSBlbGxvIHNlIGVtcGxlYXLDoSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhLCBlbCBjdcOhbCBlcyBhbXBsaWFtZW50ZSB1dGlsaXphZG8gcGFyYSByZXNvbHZlciBwcm9ibGVtYXMgZGUgY2xhc2lmaWNhY2nDs24gYmluYXJpYS4NCg0KVW5hIHZleiBzZSByZWFsaXphbiBsb3MgZmlsdHJvcyBkZSBjYWxpZGFkIHkgY29tcGxldGl0dWQsIHkgdHJhcyBsbyBvYnRlbmlkbyBlbiBsb3MgcmVzdWx0YWRvcyBkZWwgV09FLCBzZSBwcm9jZWRlIGEgcmVhbGl6YXIgbGEgc2VsZWNjaW9uIGRlIHZhcmlhYmxlcyBwYXJhIGVsIG1vZGVsby4gU2UgdGVuZHLDoW4gZW4gY3VlbnRhIGVudG9uY2VzLCBlbCBwYWdvIHJlYWxpemFkbywgbG9zIGTDrWFzIGVuIHF1ZSBlc3R1dm8gZWwgcGFjaWVudGUgZGUgZm9ybWEgZ2VuZXJhbCwgZWwgaGVjaG8gZGUgcXVlIHNlIGxlIGhheWEgcmVhbGl6YWRvIG8gbm8gdW5hIGNpcnVnw61hLCBlbCBnw6luZXJvLCBsYSBlZGFkIHkgZWwgZXN0cmF0by4NCg0KUGFyYSBldmFsdWFyIGxhIGNhcGFjaWRhZCBkZSBnZW5lcmFsaXphY2nDs24gZGVsIG1vZGVsbywgc2UgZGl2aWRpcsOhIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVuIGVudHJlbmFtaWVudG8gKDcwJSkgeSBwcnVlYmEgKDMwJSkuDQoNClRhbWJpw6luIHZhbW9zIGEgZXNjYWxhciBudWVzdHJhcyB2YXJpYWJsZXMgbnVtZXJpY2FzLCBkZWJpZG8gYSBxdWUgdGVuZW1vcyB1bm9zIHZhbG9yZXMgbXV5IGFsdG9zIGVuIGVsIHBhZ28gZGUgbGEgaG9zcGl0YWxpemFjacOzbiBsb3MgY3VhbGVzIHB1ZWRlbiBnZW5lcmFyIGluZmx1ZW5jaWFzIGVuIGVsIG1vZGVsbyBoYWNpYSBlc3RhIHZhcmlhYmxlLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnNldC5zZWVkKDEyMzQpDQoNCmRhdGFfcmVob3NwICU+JQ0KICBzZWxlY3QoaWQsDQogICAgICAgIHBhZ29faG9zcCwNCiAgICAgICAgcXVpcnVyLA0KICAgICAgICBkaWFzX2hvc3AsDQogICAgICAgIGdlbmVybywNCiAgICAgICAgZWRhZCwNCiAgICAgICAgZXN0cmF0bywNCiAgICAgICAgcmVob3NwX29tcykgLT4gbW9kZWxfcmVob3NwDQoNCm1vZGVsX3JlaG9zcCAlPiUNCiAgc2FtcGxlX2ZyYWMoc2l6ZSA9IDAuNykgLT4gdHJhaW5pbmcNCg0KbW9kZWxfcmVob3NwICU+JQ0KICBhbnRpX2pvaW4oeCA9IC4sDQogICAgICAgICAgICB5ID0gdHJhaW5pbmcsDQogICAgICAgICAgICBieSA9ICJpZCIpIC0+IHRlc3RpbmcNCg0KdGVzdGluZyAlPiUNCiAgc2VsZWN0KC1pZCkgLT4gdGVzdGluZw0KDQp0cmFpbmluZyAlPiUNCiAgc2VsZWN0KC1pZCkgJT4lDQogIG11dGF0ZShyZWhvc3Bfb21zID0gYXMuZmFjdG9yKHJlaG9zcF9vbXMpKSAtPiB0cmFpbmluZw0KDQojdHJhaW5pbmcgPC0gdHJhaW5pbmcgJT4lIG11dGF0ZV9lYWNoXyhmdW5zKHNjYWxlKC4pICU+JSBhcy52ZWN0b3IpLCAgICAgICAgICAgdmFycz1jKCJwYWdvX2hvc3AiLCJkaWFzX2hvc3AiKSkgDQoNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMyBpZD0iU01PVEUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBtYXJrZG93bj0iMSI+U21vdGU8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkNvbW8gc2UgaGFiaWEgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlLCBsYSBpbmZvcm1hY2lvbiBzZSBlbmN1ZW50cmEgZGVzYmFsYW5jZWFkYTsgZXN0byBlcywgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBlbCBwcm9ibGVtYSBlbiBxdWUgc2UgZXN0YSB0cmFiYWphbmRvIGNvbnNpc3RlIGVuIGxhIGNsYXNpZmljYWNpb24gZGUgdW5hIHZhcmlhYmxlIGRpY290w7NtaWNhLCBzZSBkZWJlIGFuYWxpemFyIGVsIG5pdmVsIGRlIHJlcHJlc2VudGFjaW9uIGRlIHN1cyBwb3NpYmxlcyB2YWxvcmVzIGRlbnRybyBkZWwgY29uanVudG8gdG90YWwgZGUgZGF0b3MuPC9kaXY+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KDQprYWJsZShhcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUobW9kZWxfcmVob3NwJHJlaG9zcF9vbXMpKSkpICU+JQ0Ka2FibGVfc3R5bGluZyhwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgcm93X2xhYmVsX3Bvc2l0aW9uID0gMSwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpICU+JQ0Kcm93X3NwZWMoMCxiYWNrZ3JvdW5kPSIjRUJGMEY3IikNCg0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KVmVtb3MgcXVlIGxhIHJlcHJlc2VudGFjaW9uIHBhcmEgbGEgY2F0ZWdvcsOtYSBwb3NpdGl2YSBlcyB1biBwb2NvIG1hcyBkZWwgMiUgZGUgbGEgaW5mb3JtYWNpw7NuLiBFbiBlc3RlIGNhc28gdmFtb3MgYSByZWFsaXphciB1biB0cmF0YW1pZW50byBxdWUgcGVybWl0YSBhdW1lbnRhciBsYSBjbGFzZSBtaW5vcml0YXJpYSwgc2luIHV0aWxpemFyIHNvbHVjaW9uZXMgZ2Vuw6lyaWNhcyBjb21vIHJlZHVjaXIgbGEgY2xhc2UgbWF5b3JpdGFyaWEgYWwgbml2ZWwgZGUgbGEgY2xhc2UgbWVub3IuDQoNClBhcmEgZWxsbywgdmFtb3MgYSB1dGlsaXphciBsYSB0w6ljbmljYSBTTU9URSAoU3ludGhldGljIE1pbm9yaXR5IE92ZXJzYW1wbGluZyBNZXRob2QpLCBsYSBjdWFsIGdlbmVyYSBudWV2YXMgaW5zdGFuY2lhcyBhcnRpZmljaWFsZXMgZGUgbGEgY2xhc2UgbcOhcyBwZXF1ZcOxYSBpbnRlcnBvbGFuZG8gbG9zIHZhbG9yZXMgZGUgbGFzIGluc3RhbmNpYXMgbWlub3JpdGFyaWFzIG3DoXMgY2VyY2FuYXMgYSB1bmEgZGFkYS4NCg0KUG9yIG1lZGlvIGRlIFNNT1RFIHNlIGdlbmVyYXLDoSB1biBudWV2byBzZXQgZGUgZGF0b3MgZGUgZW50cmVuYW1pZW50bywgZW4gZWwgY3VhbCBzZSB0ZW5nYSB1biA2MCUgZGUgaW5mb3JtYWNpb24gcGFyYSBsYSBjYXRlZ29yaWEgbmVnYXRpdmEgKHJlaG9zcF9vbXMgPSAwKSB5IDQwJSBwYXJhIGxhIGNhdGVnb3JpYSBwb3NpdGl2YSAocmVob3NwX29tcyA9IDApLjwvZGl2Pg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnRyYWluaW5nIDwtIFNNT1RFKHJlaG9zcF9vbXMgfiAuLCBhcy5kYXRhLmZyYW1lKHRyYWluaW5nKSwgcGVyYy5vdmVyID0gMzUwLCBwZXJjLnVuZGVyID0gMTUwKQ0KI3RyYWluaW5nIDwtIFNNT1RFKHJlaG9zcF9vbXMgfiAuLCBhcy5kYXRhLmZyYW1lKHRyYWluaW5nKSwgcGVyYy5vdmVyID0gMzAwLCBwZXJjLnVuZGVyID0gMjAwKQ0KYGBgDQoNClZlcmlmaWNhbW9zIHF1ZSBlbCBzZXQgZGUgZW50cmVuYW1pZW50byBzZSBlbmN1ZW50cmUgYmFsYW5jZWFkbzoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCmthYmxlX3N0eWxpbmcoa2FibGUoYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKHRyYWluaW5nJHJlaG9zcF9vbXMpKSkpLCANCiAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgIHJvd19sYWJlbF9wb3NpdGlvbiA9IDEsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKSAlPiUNCnJvd19zcGVjKDAsYmFja2dyb3VuZD0iI0VCRjBGNyIpDQoNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMyBpZD0iQWp1c3RlbW9kIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPkFqdXN0ZSBkZWwgbW9kZWxvIHkgRXN0aW1hY2nDs24gZGUgcGFyw6FtZXRyb3M8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkRlbCByZXN1bHRhZG8gZXhwbG9yYXRvcmlvIGFudGVyaW9yLCBhbCBkaXNjcmltaW5hciBlbCBhbsOhbGlzaXMgZGUgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBwb3IgbnVlc3RyYSB2YXJpYWJsZSBvYmpldGl2byAoUmVob3NwaXRhbGl6YWNpw7NuKSwgZXMgcG9zaWJsZSBldmlkZW5jaWFyIHVuYSBkaWZlcmVuY2lhIGNsYXJhIGVudHJlIGxhcyBkaXN0cmlidWNpb25lcyBwYXJhIGxvcyBhdHJpYnV0b3M6IFBhZ28vY29zdG8gZGVsIHByb2NlZGltaWVudG8geSBsb3MgZMOtYXMgZW4gcXVlIGVsIHVzdWFyaW8gZXN0dXZvIGludGVybmFkbyB5YSBzZWEgZW4gbGEgVW5pZGFkIGRlIEN1aWRhZG9zIEludGVuc2l2b3MgbyBFc3BlY2lhbGVzLiBFc3RvIHBvZHLDrWEgc2VyIHVuIGluZGljaW8gZGUgcXVlIGVzdGFzIHZhcmlhYmxlcyBlbiBwYXJ0aWN1bGFyLCBwdWVkZW4gbGxlZ2FyIGEgc2VyIHJlbGV2YW50ZXMgcGFyYSBleHBsaWNhciBsYSBwcm9iYWJpbGlkYWQgZGUgb2N1cnJlbmNpYSBkZWwgZXZlbnRvLCBlcyBkZWNpciwgY3VhbmRvIGh1Ym8gdW5hIGhvc3BpdGFsaXphY2nDs24gcG9zdGVyaW9yIGxpZ2FkYSBhIHVuIGRpYWduw7NzdGljby4NCg0KQSBjb250aW51YWNpw7NuLCBhbCBhanVzdGFyIGVsIG1vZGVsbyBvYnRlbmVtb3MgbG9zIHNpZ3VpZW50ZXMgcmVzdWx0YWRvczo8L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0Kcm0obGlzdD1scygpWyFscygpICVpbiUgYygidHJhaW5pbmciLCAidGVzdGluZyIsICJkYXRhX3JlaG9zcCIpXSkNCm15bG9naXQgPC0gZ2xtKHJlaG9zcF9vbXMgfiBwYWdvX2hvc3AgKyBxdWlydXIgKyBkaWFzX2hvc3AgKyBlZGFkICsgZ2VuZXJvICsgZXN0cmF0bywgZGF0YSA9IHRyYWluaW5nLCBmYW1pbHkgPSAiYmlub21pYWwiKQ0Kc3VtbWFyeShteWxvZ2l0KQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPjwvZGl2Pg0KMS4gQ2FkYSBjYW1iaW8gZW4gdW5hIHVuaWRhZCBlbiBlbCBwYWdvIGhvc3BpdGFsYXJpbyBkaXNtaW51aXLDoSBsYXMgcHJvYmFiaWxpZGFkZXMgZGUgcmVob3NwaXRhbGl6YWNpw7NuLCBwZXJvIGVuIHVuYSBjYW50aWRhZCBtdXkgcGVxdWXDsWEgKC02Ljk1M0UtMDgpDQoyLiBDdWFuZG8gYSB1biBwYWNpZW50ZSBzZSBsZSByZWFsaXrDsyB1biBwcm9jZWRpbWllbnRvIHF1aXLDunJnaWNvIHN1IHByb2JhYmlsaWRhZCBkZSBxdWUgdGVybWluZSBob3NwaXRhbGl6YWRvIGRlIG51ZXZvIHBvciBlbCBtaXNtbyBkaWFnbsOzc3RpY28sIGRpc21pbnV5ZSBlbiBtw6FzIGRlbCAxOSUgZW4gY29tcGFyYWNpw7NuIGEgY3VhbmRvIG5vIHNlIGxlIHJlYWxpemEgbmluZ3VuYSBjaXJ1Z8OtYS4NCg0KRWwgcmVzdG8gZGUgbGFzIHZhcmlhYmxlcyBubyBzb24gc3VmaWNpZW50ZW1lbnRlIGV4cGxpY2F0aXZhcyBwYXJhIHByZWRlY2lyLCBkZSBtYW5lcmEgc2lnbmlmaWNhdGl2YSwgc3UgZWZlY3RvIHNvYnJlIGxhIHZhcmlhYmxlIGRlIHJlc3B1ZXN0YSBiaW5hcmlhLg0KDQpEZXNwdcOpcyBkZSBlc3RpbWFkb3MgbG9zIGNvZWZpY2VudGVzIHNlIHByb2NlZGUgYSByZWFsaXphciBsYSBwcmVkaWNjacOzbiBkZW50cm8geSBmdWVyYSBkZSBtdWVzdHJhIHBhcmEgZXZhbHVhciBsYSBwcmVjaXNpw7NuIChhY2N1cmFjeSkgeSBjYXBhY2lkYWQgZGUgZ2VuZXJhbGl6YWNpw7NuIGRlIG51ZXN0cm8gbW9kZWxvLiA8L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KcHJlZF90cmFpbiA8LSBwcmVkaWN0KG15bG9naXQsIG5ld2RhdGEgPSB0cmFpbmluZ1stN10sIHR5cGUgPSAicmVzcG9uc2UiKQ0KeV9wcmVkX3RyYWluIDwtIGlmZWxzZShwcmVkX3RyYWluID4gMC41LCAxLCAwKQ0KeV9hY3RfdHJhaW4gPC0gdHJhaW5pbmckcmVob3NwX29tcw0KDQpwcmVkID0gcHJlZGljdChteWxvZ2l0LCB0eXBlID0gJ3Jlc3BvbnNlJywgbmV3ZGF0YSA9IHRlc3RpbmdbLTddKQ0KeV9wcmVkID0gaWZlbHNlKHByZWQgPiAwLjUsIDEsIDApDQp5X2FjdCA8LSB0ZXN0aW5nJHJlaG9zcF9vbXMNCg0Ka2FibGUoZGF0YS5mcmFtZShUcmFpbiA9IG1lYW4oeV9wcmVkX3RyYWluID09IHlfYWN0X3RyYWluKSwgVGVzdCA9IG1lYW4oeV9wcmVkID09IHlfYWN0KSkpICU+JQ0KICBrYWJsZV9zdHlsaW5nKHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIHJvd19sYWJlbF9wb3NpdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpICU+JQ0Kcm93X3NwZWMoMCxiYWNrZ3JvdW5kPSIjRUJGMEY3IikNCiAgDQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPjwvZGl2Pg0KTG9zIHJlc3VsdGFkb3MgaW5kaWNhbiB1biBuaXZlbCBkZSBhY2N1cmFjeSBkZSA2MiUgZW4gbG9zIGRhdG9zIGRlIGVudHJlbmFtaWVudG8geSA2MyUgZW4gdGVzdGluZy4gUGFyYSB2ZXIgZW4gZGV0YWxsZSBjb21vIHNlIGNvbXBvcnRhLCBhbCBkaXNjcmltaW5hciBlbnRyZSBsb3MgY2Fzb3MgZW4gcXVlIGVsIHBhY2llbnRlIHNhbGUgZGVmaW5pdGl2YW1lbnRlIG8gdGVybWluYSBlbiB1bmEgcmVob3NwaXRhbGl6YWNpw7NuLCB5IGV2aWRlbmNpYXIgc3UgZGVzZW1wZcOxbyBwb3Igc2VwYXJhZG8sIHNlIGVzdGltYXLDoSBsYSBtYXRyaXogZGUgY29uZnVzacOzbjo8L2Rpdj4NCg0KYGBge3J9DQp0YWJsZShhcy5tYXRyaXgodGVzdGluZ1ssIDddKSwgeV9wcmVkID4gMC41KQ0KYGBgDQoNClJlc3VsdGFkb3MgQ3VydmEgZGUgUk9DOg0KDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCmxpYnJhcnkoUk9DUikNClJPQ1JwcmVkID0gcHJlZGljdGlvbihwcmVkLCB0ZXN0aW5nJHJlaG9zcF9vbXMpDQogDQojIFBlcmZvcm1hbmNlIGZ1bmN0aW9uDQpST0NScGVyZiA9IHBlcmZvcm1hbmNlKFJPQ1JwcmVkLCAidHByIiwgImZwciIpDQoNCnBlcmYxIDwtIHBlcmZvcm1hbmNlKFJPQ1JwcmVkLCAicHJlYyIsICJyZWMiKQ0KcGxvdChwZXJmMSkNCiANCiMgUGxvdCBST0MgY3VydmUNCnBsb3QoUk9DUnBlcmYsIGNvbG9yaXplPVRSVUUsIHByaW50LmN1dG9mZnMuYXQ9c2VxKDAsMSxieT0wLjEpLCB0ZXh0LmFkaj1jKC0wLjIsMS43KSkNCg0KYGBgDQoNCiMjI1JlZ3VsYXJpemFkbw0KDQpwYXJhIGxhIHJlZ3VsYXJpemFjacOzbiBzZSB1dGlsaXphcsOhIGVsIHBhcXVldGUgZ2xtbmV0LCBlbCBjdWFsIGFzaWduYSB1biB2YWxvciBkZSBhbHBoYSA9IDAgaSBlcyByaWRnZSB5IGFscGhhID0gMSBzaSBsYXNzby4gQW50ZXMgZGUgc3VtZXJnaXJzZSBlbiBlbCBjw7NkaWdvLCB2YWxlIGxhIHBlbmEgc2XDsWFsYXIgbG8gc2lndWllbnRlOg0KDQoqIGdsbW5ldCBubyB0aWVuZSB1bmEgaW50ZXJmYXogZGUgZsOzcm11bGEsIHBvciBsbyBxdWUgdW5vIHRpZW5lIHF1ZSBpbmdyZXNhciBsb3MgcHJlZGljdG9yZXMgY29tbyB1bmEgbWF0cml6IHkgbGFzIGV0aXF1ZXRhcyBkZSBjbGFzZSBjb21vIHVuIHZlY3Rvci4NCg0KKiBubyBhY2VwdGEgcHJlZGljdG9yZXMgY2F0ZWfDs3JpY29zLCBwb3IgbG8gcXVlIHVubyB0aWVuZSBxdWUgY29udmVydGlybG9zIGVuIHZhbG9yZXMgbnVtw6lyaWNvcyBhbnRlcyBkZSBwYXNhcmxvcyBhIGdsbW5ldC4NCg0KTGEgZnVuY2nDs24gZ2xtbmV0IG1vZGVsLm1hdHJpeCBjcmVhIGxhIG1hdHJpeiB5IHRhbWJpw6luIGNvbnZpZXJ0ZSBsb3MgcHJlZGljdG9yZXMgY2F0ZWfDs3JpY29zIGVuIHZhcmlhYmxlcyBmaWN0aWNpYXMgYXByb3BpYWRhczsgbWllbnRyYXMgcXVlIHNlIHVzYXLDoSBsYSBmdW5jacOzbiBjdi5nbG1uZXQgLCBwYXJhIGVuY29udHJhIGRlIG1hbmVyYSBhdXRvbcOhdGljYXVuYSBlbCB2YWxvciDDs3B0aW1vIGRlIGxhbWJkYS4NCg0KYGBge3J9DQpsaWJyYXJ5KGdsbW5ldCkNCmxpYnJhcnkoTWF0cml4KQ0Kc2V0LnNlZWQoMTIzKSANCg0KeF90cmFpbiA8LSBtb2RlbC5tYXRyaXgocmVob3NwX29tc34uLCB0cmFpbmluZylbLC0xXQ0KeV90cmFpbiA8LSBpZmVsc2UodHJhaW5pbmckcmVob3NwX29tcyA9PSAiMSIsIDEsIDApDQoNCiMjSGFsbGFuZG8gZWwgbWVqb3IgbGFtYmRhDQpjdi5sYXNzbyA8LSBjdi5nbG1uZXQoeF90cmFpbiwgeV90cmFpbiwgZmFtaWx5ID0gImJpbm9taWFsIiwgdHlwZS5tZWFzdXJlID0gIm1zZSIsIGFscGhhID0gMSkNCnBsb3QoY3YubGFzc28pDQpgYGANCg0KTGEgZ3LDoWZpY2EgbXVlc3RyYSBxdWUgZWwgcmVnaXN0cm8gZGVsIHZhbG9yIMOzcHRpbW8gZGUgbGFtYmRhIChlcyBkZWNpciwgZWwgcXVlIG1pbmltaXphIGVsIGVycm9yIGN1YWRyw6F0aWNvIG1lZGlvKSBlcyBhcHJveGltYWRhbWVudGUgLTMuIEVsIHZhbG9yIGV4YWN0byBzZSBwdWVkZSB2ZXIgYWwgZXhhbWluYXIgbGEgdmFyaWFibGUgbGFtYmRhX21pbiBlbiBlbCBjw7NkaWdvIGEgY29udGludWFjacOzbi4gRW4gZ2VuZXJhbCwgc2luIGVtYmFyZ28sIGVsIG9iamV0aXZvIGRlIGxhIHJlZ3VsYXJpemFjacOzbiBlcyBlcXVpbGlicmFyIGxhIHByZWNpc2nDs24geSBsYSBzaW1wbGljaWRhZC4gRW4gZWwgY29udGV4dG8gYWN0dWFsLCBlc3RvIHNpZ25pZmljYSB1biBtb2RlbG8gY29uIGVsIG1lbm9yIG7Dum1lcm8gZGUgY29lZmljaWVudGVzIHF1ZSB0YW1iacOpbiBwcm9wb3JjaW9uYSB1bmEgYnVlbmEgcHJlY2lzacOzbiAuIA0KDQpgYGB7cn0NCmN2Lmxhc3NvJGxhbWJkYS5taW4NCmBgYA0KDQpFbiBnZW5lcmFsLCBlbCBwcm9ww7NzaXRvIGRlIGxhIHJlZ3VsYXJpemFjacOzbiBlcyBlcXVpbGlicmFyIGxhIHByZWNpc2nDs24geSBsYSBzaW1wbGljaWRhZC4gRXN0byBzaWduaWZpY2EsIHVuIG1vZGVsbyBjb24gZWwgbWVub3IgbsO6bWVybyBkZSBwcmVkaWN0b3JlcyBxdWUgdGFtYmnDqW4gZGEgdW5hIGJ1ZW5hIHByZWNpc2nDs24uIFBhcmEgZXN0ZSBmaW4sIGxhIGZ1bmNpw7NuIGN2LmdsbW5ldCgpIHRhbWJpw6luIGVuY3VlbnRyYSBlbCB2YWxvciBkZSBsYW1iZGEgcXVlIHByb3BvcmNpb25hIGVsIG1vZGVsbyBtw6FzIHNpbXBsZSBwZXJvIHRhbWJpw6luIHNlIGVuY3VlbnRyYSBkZW50cm8gZGUgdW4gZXJyb3IgZXN0w6FuZGFyIGRlbCB2YWxvciDDs3B0aW1vIGRlIGxhbWJkYS4gRXN0ZSB2YWxvciBzZSBsbGFtYSBsYW1iZGEuMXNlLiBFc3RlIHZhbG9yIGRlIGxhbWJkYSAoIGxhbWJkYS4xc2UpIGVzIGxvIHF1ZSB1c2FyZW1vcyBlbiBlbCByZXN0byBkZSBsYSBjb21wdXRhY2nDs24uDQoNCg0KYGBge3J9DQpjdi5sYXNzbyRsYW1iZGEuMXNlDQpgYGANCg0KYGBge3J9DQpjb2VmKGN2Lmxhc3NvLCBjdi5sYXNzbyRsYW1iZGEubWluKQ0KYGBgDQoNCkxhIHNhbGlkYSBtdWVzdHJhIHF1ZSBzb2xvIGFxdWVsbGFzIHZhcmlhYmxlcyBxdWUgaGVtb3MgZGV0ZXJtaW5hZG8gcXVlIHNvbiBzaWduaWZpY2F0aXZhcyBlbiBiYXNlIGEgbG9zIHZhbG9yZXMgZGUgcCB0aWVuZW4gY29lZmljaWVudGVzIGRpc3RpbnRvcyBkZSBjZXJvLCBlbiBlc3RlIGNhc28gZWwgcGFnbyBob3NwaXRhbGFyaW8sIHRvZG9zIGxvcyBjb2VmaWNpZW50ZXMgZGUgbGFzIGRlbcOhcyB2YXJpYWJsZXMgaGFuIHNpZG8gcHVlc3RvcyBhIGNlcm8gcG9yIGVsIGFsZ29yaXRtby4NCg0KVXNhbmRvIGxhbWJkYS4xc2Vjb21vIGxhIG1lam9yIGxhbWJkYSwgZGEgbG9zIHNpZ3VpZW50ZXMgY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs246DQoNCmBgYHtyfQ0KY29lZihjdi5sYXNzbywgY3YubGFzc28kbGFtYmRhLjFzZSkNCmBgYA0KDQpVc2FuZG8gbGFtYmRhLjFzZSwgbG9zIGNvZWZpY2llbnRlIGRlIDQgdmFyaWFibGVzIHNlIGhhbiBlc3RhYmxlY2lkbyBlbiBjZXJvIG1lZGlhbnRlIGVsIGFsZ29yaXRtbyBkZSBsYXpvLCByZWR1Y2llbmRvIGxhIGNvbXBsZWppZGFkIGRlbCBtb2RlbG8uDQoNCkxhIGNvbmZpZ3VyYWNpw7NuIGRlIGxhbWJkYSA9IGxhbWJkYS4xc2UgcHJvZHVjZSB1biBtb2RlbG8gbcOhcyBzaW1wbGUgZW4gY29tcGFyYWNpw7NuIGNvbiBsYW1iZGEubWluLCBwZXJvIGVsIG1vZGVsbyBwb2Ryw61hIHNlciB1biBwb2NvIG1lbm9zIHByZWNpc28gcXVlIGVsIG9idGVuaWRvIGNvbiBsYW1iZGEubWluLg0KDQpgYGB7cn0NCiMjTGFtYmRhIHJlZ3Jlc3Npb24NCnN0ZF9yaWRnZV9sb2dpdCA8LSBnbG1uZXQoeF90cmFpbiwgeV90cmFpbiwgZmFtaWx5PSJiaW5vbWlhbCIsIGFscGhhPTEpDQpTUkxfcHJlZF90cmFpbiA8LSBwcmVkaWN0KHN0ZF9yaWRnZV9sb2dpdCwgeF90cmFpbiwgdHlwZT0iY2xhc3MiLCBzPWN2Lmxhc3NvJGxhbWJkYS4xc2UpDQoNCmBgYA0KDQojIyNNYXRyaXogdHJhaW5pbmcNCmBgYHtyfQ0KY29uZnVzaW9uX21hdHJpeF90cmFpbiA8LSB0YWJsZSh5X3RyYWluLCBTUkxfcHJlZF90cmFpbikNCmNvbmZ1c2lvbl9tYXRyaXhfdHJhaW4NCmBgYA0KDQpgYGB7cn0NCmVycm9yX3JhdGVfdHJhaW4gPC0gKDc2MCs5MjApLyg3NjArOTIwKzE4MTQrMTM2OCkNCmVycm9yX3JhdGVfdHJhaW4NCmBgYA0KDQojIyNNYXRyaXogdGVzdA0KYGBge3J9DQoNCnhfdGVzdCA8LSBtb2RlbC5tYXRyaXgocmVob3NwX29tc34uLCB0ZXN0aW5nKVssLTFdDQp5X3Rlc3QgPC0gaWZlbHNlKHRlc3RpbmckcmVob3NwX29tcyA9PSAxLCAxLCAwKQ0KDQoNCmBgYA0KDQpgYGB7cn0NClNSTF9wcmVkX3Rlc3QgPC0gcHJlZGljdChzdGRfcmlkZ2VfbG9naXQsIHhfdGVzdCwgdHlwZT0iY2xhc3MiLCBzPWN2Lmxhc3NvJGxhbWJkYS4xc2UpDQpjb25mdXNpb25fbWF0cml4X3Rlc3QgPC0gdGFibGUoeV90ZXN0LCBTUkxfcHJlZF90ZXN0KQ0KY29uZnVzaW9uX21hdHJpeF90ZXN0DQpgYGANCg0KYGBge3J9DQplcnJvcl9yYXRlX3Rlc3QgPC0gKDg0KzI4NjcpLyg3MzQ0KzI4NjcrODQrMTI5KQ0KZXJyb3JfcmF0ZV90ZXN0DQpgYGANCg0KQ2FsY3VsYW5kbyBlbCBtb2RlbG8gY29uIHJpZGdlOg0KYGBge3J9DQojI0hhbGxhbmRvIGVsIG1lam9yIGxhbWJkYQ0KY3YucmlkZ2UgPC0gY3YuZ2xtbmV0KHhfdHJhaW4sIHlfdHJhaW4sIGZhbWlseSA9ICJiaW5vbWlhbCIsIHR5cGUubWVhc3VyZSA9ICJtc2UiLCBhbHBoYSA9IDApDQpjb2VmKGN2LnJpZGdlLCBjdi5yaWRnZSRsYW1iZGEuMXNlKQ0KYGBgDQoNCmBgYHtyfQ0KU1JSX3ByZWRfdGVzdCA8LSBwcmVkaWN0KHN0ZF9yaWRnZV9sb2dpdCwgeF90ZXN0LCB0eXBlPSJjbGFzcyIsIHM9Y3YucmlkZ2UkbGFtYmRhLjFzZSkNCmNvbmZ1c2lvbl9tYXRyaXhfdGVzdCA8LSB0YWJsZSh5X3Rlc3QsIFNSUl9wcmVkX3Rlc3QpDQpjb25mdXNpb25fbWF0cml4X3Rlc3QNCmBgYA0KDQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KPGhyPg0KPGgzIGlkPSJSZWNvbWVuZGFjaW9uIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPlJlY29tZW5kYWNpb25lcyB5IEVzdHJhdGVnaWFzPC9oMz4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpDb21vIHNlIHB1ZG8gb2JzZXJ2YXIgZW4gbGEgZGVmaW5pY2lvbiBkZSBsYSB2YXJpYWJsZSBlbmTDs2dlbmEgZGUgbGEgcmVob3NwaXRhbGl6YWNpw7NuLCBlc3RhIHNlIGNvbnN0cnV5w7MgbWVkaWFudGUgZG9zIHJlc3RyaWNjaW9uZXMgZW4gZWwgc2V0IGRlIGRhdG9zIGluaWNpYWw6DQoxLiBRdWUgZGVudHJvIGRlIGxvcyBzaWd1aWVudGVzIDMwIGRpYXMgYSBsYSBwcmltZXJhIGhvc3BpdGFsaXphY2nDs24gc3VyZ2llcmEgdW5hIHNlZ3VuZGEgaG9zcGl0YWxpemFjaW9uLg0KMi4gUXVlIHBhcmEgYXF1ZWxsb3MgY2Fzb3MgZG9uZGUgaGF5IGRvcyBldmVudG9zIGVuIGxhIHZlbnRhbmEgZGUgMzAgZMOtYXMsIGxvcyBjw7NkaWdvcyBkZSBkaWFnbsOzc3RpY28gQ0lFMTAgZGVsIHByaW1lcm8geSBzZWd1bmRvIGV2ZW50byBwZXJ0ZW5lY2llcmFuIGEgbGEgbWlzbWEgY2F0ZWdvcsOtYSBkZSBkaWFnw7NzdGljbyBlbiBsYSBjbGFzaWZpY2FjacOzbiBkZSBsYSBPTVMuDQoNCkVuIGVzdGUgc2VudGlkbywgdGVuZW1vcyBkb3MgY29uZGljaW9uYW50ZXMgcXVlIHNlIHBvZHLDrWFuIGFqdXN0YXIsIHlhIHF1ZSByZXN0cmluZ2VuIGxhIHBvc2liaWxpZGFkIGRlIGVuY29udHJhciB1biBtYXlvciBudW1lcm8gZGUgY2Fzb3MgcXVlIHNlIHB1ZWRhbiBjb25zaWRlcmFyIGNvbW8gcmVob3NwaXRhbGl6YWNpw7NuOyBwb3IgZWplbXBsbywgYWxndW5vcyBlc3R1ZGlvcyBzdWdpZXJlbiBxdWUgbGEgdmVudGFuYSBkZSB0aWVtcG8gcG9kcsOtYSBzZXIgZGUgMTUgZGlhcyBlbnRyZSBlbCBwcmltZXIgeSBzZWd1bmRvIGV2ZW50by4gRW4gY3VhbnRvIGEgbGEgc2ltaWxpdHVkIGRlIGxvcyBkaWFnbsOzc3RpY29zIGRlIGFtYm9zIGV2ZW50b3MsIHBhcmEgZXN0ZSBtb2RlbG8gc2UgdHV2byBlbiBjdWVudGEgc29sbyBzaSBhbWJvcyBkaWFnbsOzc3RpY29zIHBlcnRlbmVjZW4gYSBsYSBtaXNtYSBjYXRlZ29yw61hLCBzaW4gZW1iYXJnbyBlcyBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YSBxdWUgaGF5IGRpYWduw7NzdGljb3MgcXVlIHB1ZWRlbiBkZXNlbmNhZGVuYXIgZW4gb3Ryb3MgcXVlIG5vIG5lY2VzYXJpYW1lbnRlIHNlYW4gZGUgbGEgbWlzbWEgY2F0ZWdvcsOtYS4gRXN0ZSB0aXBvIGRlIGFzb2NpYWNpb25lcyByZXF1aWVyZW4gZGUgdW4gbWF5b3IgYW7DoWxpc2lzIGEgbml2ZWwgbcOpZGljby4NCg0KU2UgaGFuIGRlc2NyaXRvIGZhY3RvcmVzIGFzb2NpYWRvcyBjb24gbGEgcmVob3NwaXRhbGl6YWNpb24gcmVsYWNpb25hZG9zIGNvbiBsYSBjYWxpZGFkIGRlIHZpZGEgZGUgbG9zIHBhY2llbnRlcywgc2luIGVtYmFyZ28gZW4gZXN0ZSBtb2RlbG8gbm8gc2UgaW5jbHV5byBncmFuIHBhcnRlIGRlIGVzdGUgdGlwbyBkZSBpbmZvcm1hY2lvbiwgeWEgcXVlLCBkZXNkZSBlbCBwcmluY2lwaW8sIGxhIHBvYmxhY2nDs24gb2JqZXRpdm8gc2UgY29tcG9uZSBkZSBpbmRpdmlkdW9zIGFzZWd1cmFkb3MgZW4gcG9saXphIGRlIHZpZGEgeSBzYWx1ZCwgZW4gc3UgbWF5b3JpYSwgZGUgZXN0cmF0byBjdWF0cm8gaGFjaWEgYXJyaWJhLiBEZSBlc3RhIGZvcm1hIHlhIG5vIGFwb3J0YSBpbmZvcm1hY2nDs24gbWVkaXIgZWwgbml2ZWwgZGUgY2FsaWRhZCBkZSB2aWRhIG8gZmFsaWNpZGFkIGRlIGFjY2VzbyBhIGxvcyBzZXJ2aWNpb3MgZGUgc2FsdWQsIHBlcm8gc2UgcG9kcmlhIHRlbmVyIGVuIGN1ZW50YSBpbmZvcm1hY2nDs24gcmVsYWNpb25hZGEgY29uIHNpbnRvbWFzIGRlcHJlc2l2b3MuDQoNCkxhIGNhbGlkYWQgZW4gZWwgY3VpZGFkbyBob3NwaXRhbGFyaW8gdGFtYmllbiBzZSBoYSBjb25zaWRlcmFkbyBjb21vIHVuIGZhY3RvciBpbXBvcnRhbnRlLCBwb3IgbG8gdGFudG8gc2UgcG9kcsOtYSBjb25zaWRlcmFyIGxhIGFncmVnYWNpw7NuIGRlICBpbmZvcm1hY2nDs24gcXVlIGluZGlxdWUgcXVlIHRhbiDDs3B0aW1hcyBzb24gbGFzIGNvbmRpY2lvbmVzIHBhcmEgdW5hIGJ1ZW5hIGF0ZW5jacOzbiBlbiBsb3MgY2VudHJvcyBob3NwaXRhbGFyaW9zIHkgbHVnYXJlcyBxdWUgc2UgdHV2aWVyb24gZW4gY3VlbnRhLjwvZGl2Pg0KDQpgYGB7cn0NCiMgUEFTTyAxOiAgIENhcmdhIFBhY2thZ2UgeSBTZXQgZGUgZGF0b3MNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpsaWJyYXJ5KEM1MCkNCmxpYnJhcnkocnBhcnQpDQpsaWJyYXJ5KHJwYXJ0LnBsb3QpIA0KZGF0YShjaHVybik7ICMgY2FyZ2EgdGFibGFzDQoNCiMgUEFTTyAyOiAgIENyZWEgQXJib2wgZGUgRGVjaXNpb24NCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpNb2RlbG9BcmJvbCA8LSBycGFydChyZWhvc3Bfb21zIH4gLiwgZGF0YSA9IHRyYWluaW5nLCBwYXJtcz1saXN0KHNwbGl0PSJpbmZvcm1hdGlvbiIpKQ0KDQojIFBBU08gMzogIFByZWRpY2UgcmVob3NwaXRhbGl6YWNpb24gZW4gZGF0b3MgZGUgVEVTVA0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClByZWRpY2Npb24gPC0gcHJlZGljdChNb2RlbG9BcmJvbCwgdGVzdGluZywgdHlwZT0iY2xhc3MiKSAjIFByZWRpY2Npw7NuIGVuIFRlc3QNCk1DICAgICAgICAgPC0gdGFibGUodGVzdGluZyRyZWhvc3Bfb21zLCBQcmVkaWNjaW9uKSAjIE1hdHJpeiBkZSBDb25mdXNpw7NuDQoNCk1DDQojIFBBU08gNDogQ3JlYSBHcmFmaWNvDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KcnBhcnQucGxvdChNb2RlbG9BcmJvbCwgdHlwZT0xLCBleHRyYT0xMDAsY2V4ID0gLjcsICBib3guY29sPWMoImdyYXk5OSIsICJncmF5ODgiKVtNb2RlbG9BcmJvbCRmcmFtZSR5dmFsXSkNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShlMTA3MSkNCg0KIyBFamVjdWNpw7NuIGRlbCBtb2RlbG8gU1ZNDQptb2RlbG9zdm0gPC0gc3ZtKHJlaG9zcF9vbXMgfiAuLCBkYXRhID0gdHJhaW5pbmcpDQoNCiMgUHJlZGljY2nDs24gZGUgbG9zIHJlc3RhbnRlcw0KcHJlZGljY2lvbnN2bSA8LSBwcmVkaWN0KG1vZGVsb3N2bSwgbmV3ID0gdGVzdGluZykNCg0KIyBUYWJsYSBkZSBjb25mdXNpw7NuLg0KIyBTZSB1c2Egd2l0aCBwYXJhIHF1ZSBhcGFyZXpjYSBlbCBub21icmUgZGUgbGEgdmFyaWFibGUgU3BlY2llcyBlbiBlbGxhDQojIHlhIHF1ZSBlbiBjYXNvIGNvbnRyYXJpbyBubyBzYWxlLg0KKG1jIDwtIHdpdGgodGVzdGluZywodGFibGUocHJlZGljY2lvbnN2bSwgcmVob3NwX29tcykpKSkNCg0KDQojICUgY29ycmVjdGFtZW50ZSBjbGFzaWZpY2Fkb3MNCihjb3JyZWN0b3MgPC0gc3VtKGRpYWcobWMpKSAvIG5yb3codGVzdGluZykgKjEwMCkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoaXByZWQpDQoNCiMgRWplY3VjacOzbiBkZWwgbW9kZWxvIGRlIEJhZ2dpbmcNCm1vZGVsb2JhZyA8LSBiYWdnaW5nKHJlaG9zcF9vbXN+LiwgZGF0YT10cmFpbmluZykNCg0KIyBSZXN1bWVuIGRlbCBhanVzdGUgZGVsIG1vZGVsbw0KI21vZGVsbw0KIyMgDQojIyBCYWdnaW5nIGNsYXNzaWZpY2F0aW9uIHRyZWVzIHdpdGggMjUgYm9vdHN0cmFwIHJlcGxpY2F0aW9ucyANCiMjIA0KIyMgQ2FsbDogYmFnZ2luZy5kYXRhLmZyYW1lKGZvcm11bGEgPSBTcGVjaWVzIH4gLiwgZGF0YSA9IGRhdG9zLmVudHJlbm8pDQojIEhhY2VyIHByZWRpY2Npb25lcw0KcHJlZGljY2lvbmJhZyA8LSBwcmVkaWN0KG1vZGVsb2JhZywgdGVzdGluZykNCg0KIyBNYXRyaXogZGUgY29uZnVzacOzbg0KKG1jIDwtIHdpdGgodGVzdGluZyx0YWJsZShwcmVkaWNjaW9uYmFnLCByZWhvc3Bfb21zKSkpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQojIENhcmdhIGVsIHBhcXVldGUgZXNwZWPDrWZpY28gZGVsIG3DqXRvZG8gUmFuZG9tIEZvcmVzdA0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQoNCiMgQWp1c3RhciBtb2RlbG8NCm1vZGVsb1JGb3Jlc3QgPC0gcmFuZG9tRm9yZXN0KHJlaG9zcF9vbXN+LiwgZGF0YT10cmFpbmluZykNCg0KIyBSZXN1bWVuIGRlbCBhanVzdGUgZGVsIG1vZGVsbw0KI21vZGVsbw0KDQpwcmVkaWNjaW9uUkZvcmVzdCA8LSBwcmVkaWN0KG1vZGVsb1JGb3Jlc3QsIHRlc3RpbmcpDQoNCiMgTWF0cml6IGRlIGNvbmZ1c2nDs24NCihtYyA8LSB3aXRoKHRlc3RpbmcsIHRhYmxlKHByZWRpY2Npb25SRm9yZXN0LCByZWhvc3Bfb21zKSkpDQoNCmBgYA==
>>>>>>> efc30a0ae56cc1b314ccb53037263342ef03d0f7